请教一下各位仁兄高手,如何在SQL Server2000中获取某个数据库中某表的字段名?

yaoike 2005-04-27 03:00:26
问题如题目所示,我想把表中的字段名(而不是该字段的值)赋给一个变量,可是不知道如何获

取,故请教一下各位仁兄高手,望您点拔一二。如果可以不用组件的话,希望可以不用。如果

要用到的话,希望可以是ADO标签页或是Data Access标签页里的控件。

谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢

谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢

谢谢谢谢谢谢谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

还有一点题外话,可否顺便说一下,大家平常在C++ Build中遇到问题,一般是怎么解决的啊?

您可否说一下,像上面的问题,我就是因为不懂得查帮助,查了等于没查,所以,不好意思才

来问的,总是上CSDN麻烦大家帮忙解答问题的话,我感到于心不安了。呵呵~~~ ^_^


...全文
229 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kwokwinglau 2005-04-30
if( !ADOQuery1->Eof)
回复
Sephil 2005-04-28
DECLARE @FTable varchar(20)
DECLARE @FField varchar(20)
DECLARE @FType varchar(20)
DECLARE @FSize varchar(10)
DECLARE @FNull varchar(10)
DECLARE @SQL varchar(200)

DECLARE cur CURSOR FOR
SELECT
so.[name] TableName,
sc.[name] FieldName,
st.[name] FieldType,
sc.length FieldSize,
CASE WHEN sc.isnullable = 0 THEN 'NOT NULL' ELSE 'NULL' END Nullable
FROM sysobjects so,
(SELECT * FROM syscolumns WHERE [name] LIKE 'ch%DwBh%') sc
LEFT JOIN systypes st ON st.xtype = sc.xtype
WHERE so.TYPE = 'U' AND so.[id] = sc.[id]
ORDER BY so.[name]

OPEN cur
FETCH NEXT FROM cur INTO @FTable, @FField, @FType, @FSize, @FNull

WHILE @@FETCH_STATUS = 0
BEGIN
IF Convert(int, @FSize) < 40 SET @FSize = '40'
SET @SQL = 'ALTER TABLE ' + @FTable + ' ALTER COLUMN ' + @FField + ' varchar(' + @FSize + ') ' + @FNull
SET @SQL = @SQL + ' UPDATE ' + @FTable + ' SET ' + @FField + ' = RTrim(' + @FField + ') '
PRINT @SQL
EXEC(@SQL)

FETCH NEXT FROM cur INTO @FTable, @FField, @FType, @FSize, @FNull
END

CLOSE cur
DEALLOCATE cur
GO
回复
clong320 2005-04-28
学习,学习.
回复
我不懂电脑 2005-04-28
The example below fetches a list of all tables in an ADO data store. It then traverses this list, making an entry in another table with each table抯 name and number of records.

TStrings *SL = new TStringList;

try
{
ADOConnection1->GetTableNames(SL, false);
for (int index = 0; index < SL->Count; index++)
{
Table1->Insert();
Table1->FieldByName("Name")->AsString = SL->Strings[index];
if (ADOTable1->Active)
ADOTable1->Close();
ADOTable1->TableName = SL->Strings[index];
ADOTable1->Open();
Table1->FieldByName("Records")->AsInteger = ADOTable1->RecordCount;
Table1->Post();
}
}
__finally

{
delete SL;
ADOTable1.Close()
}
回复
kmfangxun 2005-04-28

ADOQuery1->Close();
ADOQuery1->SQL->Text="select * from mytable ";
ADOQuery1->Open();
ADOQuery1->GetFieldNames(ListBox1->Items);

for(int i=0;i<ListBox1->Count;i++)
{
a[i]=ListBox1->Items->String[i];
}

回复
yaoike 2005-04-28
To:songhtao(三十年孤独)
谢谢你的解答,不过,你可否针对我的问题作下解答啊?由于本人愚钝,不懂得你那段代码的应用。
再次谢谢大家抽空在忙中来回答问题!!!

大家可否解答一下我在8楼的问题啊?在此我再贴上?谢谢你的仔细阅读?

非常感谢各位高手的回答,谢谢,谢谢,谢谢啦~~~
大家真的好热心啊?
不过,我在编译程序的时侯,程序说:[C++ Error] Unit1.cpp(29): E2316 'Record' is not a member of 'TADOQuery',我的C++ Build 是6.0的,不知道是什么原因,因此,我改用成:
if( !ADOQuery1->IsEmpty() )
{
AnsiString *a=new AnsiString[ADOQuery1->RecordCount]
ADOQuery1->first();
for(int i=0;i<ADOQuery1->RecordCount;i++)
{
a[i]=ADOQuery1->FieldByName("Name")->AsString;
ADOQuery1->Next();
}
}
不知道是否正确!!! 谢谢大家的指点~~~ 再次谢谢大家在忙中抽空来回答问题!!!!!!!!! ^_^
回复
yaoike 2005-04-27
非常感谢各位高手的回答,谢谢,谢谢,谢谢啦~~~
大家真的好热心啊?
不过,我在编译程序的时侯,程序说:[C++ Error] Unit1.cpp(29): E2316 'Record' is not a member of 'TADOQuery',我的C++ Build 是6.0的,不知道是什么原因,因此,我改用成:
if( !ADOQuery1->IsEmpty() )
{
AnsiString *a=new AnsiString[ADOQuery1->RecordCount]
ADOQuery1->first();
for(int i=0;i<ADOQuery1->RecordCount;i++)
{
a[i]=ADOQuery1->FieldByName("Name")->AsString;
ADOQuery1->Next();
}
}
不知道是否正确!!! 谢谢大家的指点~~~ 再次谢谢大家在忙中抽空来回答问题!!!!!!!!! ^_^
回复
yuwenfeng 2005-04-27
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear() ;
ADOQuery1->SQL->Add("select a.name from syscolumns a,sysobjects b where a.id=b.id and b.name='inquiry_result' order by colid asc");
ADOQuery1->Active=true;
if(ADOQuery1->Record)
{
AnsiString *a=new AnsiString[ADOQuery1->RecordCount]
ADOQuery1->first();
for(int i=0;i<ADOQuery1->RecordCount;i++)
{
a[i]=ADOQuery1->FieldByName("Name")->AsString;
ADOQuery1->Next();
}
}
Edit3->Text=a[0];
Edit4->Text=a[1];
Edit1->Text=ADOQuery1->FieldByName("name")->AsString;
這樣的話Edit3為第一個,
Edit4為第二個。。
Edit1為最後一條。
回复
futulove 2005-04-27
你的i没有赋初值,所以Edit3,4为空的,你的记录集没有移动,所以Edit1显示的是第一条数据的

ADOQuery1->Active=false;
ADOQuery1->SQL->Clear() ;
ADOQuery1->SQL->Add("select a.name from syscolumns a,sysobjects b where a.id=b.id and b.name='inquiry_result' order by colid asc");
ADOQuery1->Active=true;
if(ADOQuery1->Record)
{
AnsiString *a=new AnsiString[ADOQuery1->RecordCount]
for(int i=0;i<ADOQuery1->RecordCount;i++)
{
a[i]=ADOQuery1->FieldByName("Name")->AsString;
ADOQuery1->Next();
}
}
Edit3->Text=a[0];
Edit4->Text=a[1];
Edit1->Text=ADOQuery1->FieldByName("name")->AsString;

这样Edit3,4就会有值了,并且Edit1的值为最后一条记录的
回复
yaoike 2005-04-27
谢谢上面几位师傅的回答,非常感谢!!!问题解决了一半,还有一点点解决不了,
我的SQL SERVER 2000中的数据库的名称叫 "lah",其中有一个表,表名叫做 "inquiry_result",我希望是把表 "inquiry_result"中的字段名(比如:字段名student_id,teacher_id,class_id等等)取出来,并把它赋值给C++ Builder中的字符串数组变量String a[10]的话,那我应该怎么写呢?
我这样写不行?
ADOQuery1->Active=false;
ADOQuery1->SQL->Clear() ;
ADOQuery1->SQL->Add("select a.name from syscolumns a,sysobjects b where a.id=b.id and b.name='inquiry_result' order by colid asc");
ADOQuery1->Active=true;
String a[26];
for (int i;i<6;i++)
{
a[i]=ADOQuery1->FieldByName("name")->AsString;

}

Edit3->Text=a[0];
Edit4->Text=a[1];
Edit1->Text=ADOQuery1->FieldByName("name")->AsString;

结果 Edit3 和 Edit4 都没有显示,而 Edit1却显示第一个字段名,但是其它的字段名不显示,(我一共有26个字段名),请问我怎么把26个字段名赋值给字符串数组a呢?

谢谢大家在忙中抽空来回答!!!!!!!!!!!!!!
回复
wanxin_sz 2005-04-27
没搞懂,楼主想怎么获的表的字段名,
第1,如果是想通过前台工具c++builder获的话,可以用ado的相关控件,有ADOTABEL吧,有个fields的字段集可以获的
2。如果是想在sqlserver里面直接获得的话,可以用SQL语句执行操作也可以获的,没具体看,楼主自己查一下。
回复
yuwenfeng 2005-04-27
select a.name from syscolumns a,sysobjects b where a.id=b.id and b.name='你的表名'
是對的。。
PF,futulove(福途£爱).
回复
futulove 2005-04-27
select a.name from syscolumns a,sysobjects b where a.id=b.id and b.name='你的表名'
回复
futulove 2005-04-27
你可以上SQL版里去查询一下很多的
回复
相关推荐
发帖
数据库及相关技术
创建于2007-08-02

1159

社区成员

C++ Builder 数据库及相关技术
申请成为版主
帖子事件
创建了帖子
2005-04-27 03:00
社区公告
暂无公告