table中字段属性的运用问题

hcman 2000-01-28 06:14:00
请看以下:

procedure button1.onclick(sender:object);
var i: Integer;
begin
table2.close;
table2.databasename:='dbdemos';
table2.tablename:=clients.db;
table2.Open;
table1.databasename:='dbdemos';
table1.tablename:=mytable.db;
table1.open;
for i:= 0 to Table2.FieldDefs.Count-1 do
begin
table1.insert;
Table1.FieldByName('字段名').Asstring :=table2.fielddefs.items[i].name;
Table1.FieldByName('长度').Asstring :=table2.fielddefs.items[i].size;
Table1.FieldByName('类型').Asstring :inttostr(table2.fielddefs.items[i].datatype);
Table1.FieldByName('小数位').Asstring :=inttost(table2.fielddefs.items[i].Precision);
end;
Table1.open;
其中table1用dbgrid1显示
问题1:table1的四个字段datatype属性为ftstring;但此时运行后table1的'长度'字段下的内容不正确
问题2: 当table1的字段设置成ftinteger时,此字段的size属性不能成功输入提示:invaild field size
问题3:如何将table2中各字段的'类型'插入table1;
...全文
165 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Venne 2000-01-28
  • 打赏
  • 举报
回复
其实你所需要做的事情是需要获得数据字段的定义是吧?就像EXPLORER做的那样,但是FieldDef下定义的Size呀,精确位这些的并不是数据表的结构定义,如果你要获得数据表的结构定义,你需要使用BDE的API函数,具体的参考你可以看一下Borland Database Engine Online Reference,在HELP菜单下的BDE帮助下面.
其实需要注意的是FLDDesc结构,这个结构的数据由DbiGetFieldDescs函数获得,下面是一个例子:
procedure ShowFields(T: TTable);

var
curProp: CURProps;
pfldDes, pCurFld: pFLDDesc;
i: Integer; // counter
MemSize: Integer;
FieldList: string;
begin
Check(DbiGetCursorProps(T.Handle, curProp));
MemSize := curProp.iFields * SizeOf(FLDDesc);
pfldDes := AllocMem(MemSize);
try
pCurFld := pfldDes;
Check(DbiGetFieldDescs(T.Handle, pfldDes));
I := 0;
FieldList := '';
while (i < curProp.iFields) do begin
FieldList := FieldList + Format('%d - %s'#13#10,[pCurFld^.iFldNum,
pCurFld^.szName]);
inc(pCurFld);
inc(i);
end;
finally
ShowMessage(FieldList);
FreeMem(pfldDes, MemSize);
end;
end;

FLDDesc结构的定义如下:
iFldNum 整型数,表中字段的数据.
szName 字段名
iFldType 整型,字段类型
iSubType 整型,字段副类型,如果有的话
iUnits1 整型,指明字段的长度,如果字符型,则是字符长度,数据型,则是数据长度
iUnits2 整型,如果是数据,则这个就是小数位.
iOffset 整型,偏移量
iLen 整型,字段在记录中的长度
以下还有一些东西,我怕麻烦就不贴了,你自己查一查吧,得到这些数据,要填进一个表就很容易了,另外一句,你可以使用table.fieldvalues[Fieldname]来取得值或者设置值,这样也许你觉得更方便一些.
laotan 2000-01-28
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;FieldType:TFieldType;typestr:string;
begin
table2.close;
table2.databasename:='dbdemos';
table2.tablename:='clients.dbf';{ delphi自带的数据库 }
table2.Open;
table1.databasename:='dbdemos';
table1.tablename:='mytable.dbf';{ fsize字段为N }
table1.open;
while not table1.eof do table1.delete;
for i:= 0 to Table2.FieldDefs.Count-1 do
begin
table1.insert;
Table1.FieldByName('fname').Asstring :=table2.fielddefs.items[i].name;
Table1.FieldByName('fsize').asinteger :=table2.fielddefs.items[i].size;
FieldType:=table2.fielddefs.items[i].datatype;
{TFieldType不能简单地认为是Integer类型,虽然他是Integer的“集合”}
case FieldType of
ftString:typestr:='ftString';
//ft...:typestr:='ft...';
end;
Table1.FieldByName('ftype').Asstring :=typestr;
Table1.FieldByName('fdec').Asstring :=inttostr(table2.fielddefs.items[i].Precision);
end;
Table1.first;
table1.Refresh;
end;
由于您给的数据库类型(DB or DBF),因Clients.dbf为DBF所以用DBase for Windows,但愿能解决您的问题

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧