../Borland/Delphi5/Help/Examples/Batchmv/batmv.dpr (D6中也有此例子)
Tbatchmove需要BDE的支持,它在ADO中不行,其步骤是:
1.设置好连接MSSQL的QUERY,假定为query (其实可以指向任何一种数据库, 也可建ODBC DSN)
2.建立一个别名,为STANDARD的
3.一个TTABLE,类型选DBASE,连接到2建立的别名 table (其实可以指向任何一种数据库,也可建ODBC DSN)
4.BATCHMOVE的SOURCE为query,destinationN为table
5.MODE为BATCOPY
6....下面是执行代码
下面是用TBatchmove简单例子, 其实还可以更简单 ^_^
var
bachmove:Tbachmove;
table:Ttable;
Begin
Table:=TTable.Create(Application);
Table.Tablename:=DFWname;
Table.TableType:=ttDbase;
BatchMove.source:=Query;
BatchMove.Destination:=Table;
BatchMove.Mode:=batCopy;
try
batchMove.execute;
finally
bachMove.Free;
Table.free;
end;
end;
batcopy是拷贝数据原到一个表项中,如果表项不在,自动建立,如果在的话,先删除,
然后再根据数据域的结构建立。
如果是batAppend的话,将数据源的记录添加到记录表中,目标表必须存在(缺省)
下面是不用batchmove的办法:
var iField :integer;
begin
if ((edTotbl.text<>'') and
(edFromtbl.text<>''))then begin
tblSource.TableName:=edFromtbl.text;
{指定TableName}
tblDest.TableName:=edTotbl.text;
with tblSource do begin
Open; {打开老系统的表}
while EOF=FALSE do begin
{逐条记录处理}
qryInsert.SQL.Clear;
qryInsert.sql.Add
('Insert into '+edTotbl.text + '(');
for iField:=0 to dbg.FieldCount-1 do begin
qryInsert.sql.add
(dbg.Fields[iField].DisplayLabel);
if iField<>dbg.FieldCount-1 then
qryInsert.sql.add(',');
end;
qryInsert.sql.add(') values(');
for iField:=0 to dbg.FieldCount-1 do begin
{进行数据类型转换}
if dbg.fields[iField].DataType=ftInteger then
qryInsert.sql.add(inttostr
(dbg.fields[iField].asInteger));
if dbg.fields[iField].DataType=ftFloat then
qryInsert.sql.add(floattostr
(dbg.fields[iField].asFloat));
if dbg.fields[iField].DataType=ftDate then
qryInsert.sql.add(''''+datetostr
(dbg.fields[iField].asDateTime)+'''');
if dbg.fields[iField].DataType=ftString then begin
if dbg.fields[iField].asString<>'' then
qryInsert.sql.add(''''+dbg.fields
[iField].asString+'''')
else
qryInsert.sql.add('NULL');
end;
if iField<>dbg.FieldCount-1
then qryInsert.sql.add(',');
end;
qryInsert.sql.add(')');
qryInsert.ExecSQL;
{把数据插入到新系统的表中}
next;
end;
end;
tblDest.Close;
tblDest.Open;;
ShowMessage(' 转换完毕! ');
end
else
ShowMessage
('请输入要插入数据的表的名称 ');