这个 AppendRecord 怎么写?(50分)

  • 主题发起人 主题发起人 dglb
  • 开始时间 开始时间
D

dglb

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个由文书文件追加到数据库的程序,类似于 FoxPro 的
append From .. SDF 的功能,但数据表的结构是程序运行时由
操作员设定,在程序设计时不能确定表的结构,所以在写
MyNewTable.AppendRecord( ArrayOfField )
时 ArrayOfField 是不定的(包括变量的个数、类型),请问有
什么办法?(例如有什么数据结构可以使成员的个数随意改变?)


 
delphi的array类型是可以随便改变个数的,而如果要改变类型,可以
将变量声明为variant,至于表的结构吗,delphi可以动态生成表,字段。
最好自己看看帮助,试验一下,提高不少。
例子:
var ar:array of variant;
begin
setlength(ar,20);//根据需要调整数组长度
var ar:array of variant;
begin
setlength(ar,20);//根据需要调整数组长度
ar[0]:=5;
ar[1]:='hello'; //元素类型可变

end;
copy delphi help的create table例子:
var

NewTable: TTable;
NewIndexOptions: TIndexOptions;
TableFound: Boolean;
begin
NewTable := TTable.Create;
NewIndexOptions := [ixPrimary, ixUnique];
with NewTable do
begin
Active := False;
DatabaseName := 'DBDEMOS';
TableName := Edit1.Text;
TableType := ttDefault;
FieldDefs.Clear;
FieldDefs.Add(Edit2.Text, ftInteger, 0, False);
FieldDefs.Add(Edit3.Text, ftInteger, 0, False);
IndexDefs.Clear;

IndexDefs.Add('PrimaryIndex', Edit2.Text, NewIndexOptions);
end;
{Now check for prior existence of this table}
TableFound := FindTable(Edit1.Text); {code for FindTable not shown}
if TableFound = True then
if MessageDlg('Overwrite existing table ' + Edit1.Text + '?', mtConfirmation,
mbYesNo, 0) = mrYes then
TableFound := False;
if not TableFound then
CreateTable; { create the table}

end;
end;
 
可以用动态字组(动态数组)都行。
 
曲线救国,不失为一个好方法~
不过,我觉得,还没有达到dglb的本意~
 
至 daiqingbo:
我用了你的办法,但在 MyNewTable.AppendRecord(ar); 执行后查看数据表,
发现数据表内的内容并非 我想要的内容(表内各个字段内容都为一个整数),好象
如下:
name phone address
256 10312654 256
256 10346436 256
256 10346466 256

但我用 WATCH 查看程序运行,ar 的内容各个记录是这样的:
LittleBear 3721654 DongGuang
Steven 3726252 Gz
Jimmy 3726567 BeiJing

为什么呢?是不是 MyNewTable.AppendRecord(ar); 写错了?
 
我试过好象没问题呀,把你的源代码贴出来看看。
 
我用的是第三方控件 Halcyon V6.60
此程序运行时也出现了其它一的些错误,不知如何更正。请各位高手不啬赐教。

procedure TForm1.Button4Click(Sender: TObject);
var
SrcFile:TextFile;
fd_name,fd_Type,fd_Length,fd_Decimals,fd_info:string;
RcInfo,:string;
i,fdcnt:integer;
ar:array of Variant;
sp,ep:array of integer;
begin
ResultTable.DatabaseName:= Extractfilepath(Edit3.Text);
ResultTable.TableName:=ExtractfileName(Edit3.Text);
if not TmpTable.Active then TmpTable.Open;
setLength(sp,TmpTable.RecordCount);
setLength(ep,TmpTable.RecordCount);
TmpTable.First;
CreateHalcyonDataSet1.CreateFields.Clear;
i:=1;
While not TmpTable.Eof do
begin
fd_name:= trim(TmpTable.FieldGet('fdName'));
fd_Type:= trim(TmpTable.FieldGet('fdType'));
fd_Length:= trim(TmpTable.FieldGet('fdLength'));
fd_Decimals:= trim(TmpTable.FieldGet('fdDecimals'));
sp:=StrToInt(TmpTable.FieldGet('fdStart'));
ep:=StrToInt(TmpTable.FieldGet('fdFinish'));
Fd_info:=fd_name+';'+fd_Type+';'+fd_Length+';'+fd_Decimals;
CreateHalcyonDataSet1.CreateFields.Add(fd_info);
TmpTable.Next;
i:=i+1;
end;
CreateHalcyonDataSet1.Execute;
ResultTable.Open;
fdcnt:=ResultTable.FieldCount;
SetLength(ar,fdcnt);
AssignFile(SrcFile,Edit1.Text);
Reset(SrcFile);
while not Eof(SrcFile) do begin
ReadLn(SrcFile,RcInfo);
if trim(rcinfo)='' then continue;
if length(RcInfo)<ep[fdcnt] then Continue;
for i:=1 to fdcnt do begin
ar:=copy(RcInfo,sp,ep-sp+1);
end;
ResultTable.AppendRecord(ar);
end;
CloseFile(SrcFile);
end;
 
太长了,还有几行:
.....
if trim(rcinfo)='' then continue;
if length(RcInfo)<ep[fdcnt] then Continue;
ResultTable.Append;
for i:=1 to fdcnt do begin
ar:=copy(RcInfo,sp,ep-sp+1);
end;
ResultTable.AppendRecord(ar);
end;
CloseFile(SrcFile);
end;
 
原来不小心用了 大于 号!
还有几行:
.....
if trim(rcinfo)='' then continue;
if length(RcInfo)〈ep[fdcnt] then Continue;
ResultTable.Append;
for i:=1 to fdcnt do begin
ar:=copy(RcInfo,sp,ep-sp+1);
end;
ResultTable.AppendRecord(ar);
end;
CloseFile(SrcFile);
end;
 
不用appendrecord
改用for i:=0 to table.feildcount-1 do
table.fields.asstring:=value;
其中value是个string的数组。将你要添加的值全部转换成string型付给value.
至于数组的长度,可定义为255。
 
多人接受答案了。
 
后退
顶部