有2个数据库,db1和db2,现在想把db1的table1的一些数据批量插入到db2的table1中。
先用一个qry1,连接到db1,把数据select 出来。
然后在用一个连接到db2的qry2,通过qry1->clone(qry1),来把数据导入到qry2中,现在有个问题,怎么把数据插入db2的table1中呢?
先用一个qry1,连接到db1,把数据select 出来。
然后在用一个连接到db2的qry2,通过qry1->clone(qry1),来把数据导入到qry2中,现在有个问题,怎么把数据插入db2的table1中呢?
不知道可以不,没试过
2.'insert into A select * from B in '+QuoteStr(B表的数据文件路径),此方法使用与access,如果是sql server等,需要视具体情况而定
ADOQuery2.SQL.Text:='insert into text2.dbo.a(xm,mc) select xm,mc from test.dbo.a';
ADOQuery2.ExecSQL;以上代码是将test数据库里面的a表中的字段xm,mc添加到数据库text2数据库的表a的字段xm,mc中。
也许
with qry1 do
First;
repeat
qry2.InsertRecord([f1,f2,f3...,fn]);{你必须自己确保操作的合法性}
until Eof
end;如果嫌这麻烦,我想,你就需要:
a. 首先确保要操作的两个表的结构相同;
b. 从#1表中检出制定的记录ds1,从#2表中选出所有记录ds2,然后将ds1中的记录并入ds2中;
c. 可能需要判定游标是否支持以上操作,就算支持还需要修正ds2中的记录计数,等等。
d. 更新也许会成功。相对来说,我觉得还是第一种方法比较好,后者除非能带来明显或巨大的性能提升,且你能保证安全,也不失为一种好方法。
速度快点,Crash多点,更新频点,让客户v1,v2,v3的挤荷包,也许也不错呀。
with qry1 do
First;
repeat
qry2.InsertRecord([f1,f2,f3...,fn]);{你必须自己确保操作的合法性}
Next;
until Eof
end;
begin
db.qry2.close;
db.qry2.SQL.text:=sql;
try
if typ='o' then db.qry2.open;
if typ='e' then db.qry2.execsql;
result:=true;
except
messagebox(0,'连接超时!','失败',MB_ICONWARNING+MB_TASKMODAL+MB_OK);
result:=false;
end;
end;function tmain_f.qry1(sql:string;typ:char):boolean;
begin
db.qry1.close;
db.qry1.SQL.text:=sql;
try
if typ='o' then db.qry1.open;
if typ='e' then db.qry1.execsql;
result:=true;
except
messagebox(0,'连接超时!','失败',MB_ICONWARNING+MB_TASKMODAL+MB_OK);
result:=false;
end;
end;function tconn_f.synchronous_db(sql:string;table1:string):boolean;
var
i:integer;
begin
if main_f.sql_qry1(sql,'o') then
begin
main_f.sql_qry2(sql,'o');
//delete record
while not db.qry2.Eof do
if db.qry1.Locate(db.qry2.Fields[0].FieldName,db.qry2.Fields[0].AsString,[])=false then db.qry2.Delete else db.qry2.next;
//update record
while not db.qry1.Eof do
begin
if db.qry2.Locate(db.qry1.Fields[0].FieldName,db.qry1.Fields[0].AsString,[])=false then
begin
db.qry2.Insert;
for I := 0 to db.qry1.FieldCount - 1 do
db.qry2.Fields[i]:=db.qry1.Fields[i];
end
else
begin
db.qry2.UpdateRecord;
for I := 0 to db.qry1.FieldCount - 1 do
db.qry2.Fields[i]:=db.qry1.Fields[i];
end;
end;
result:=true;
end
else result:=false;
end;