我用BDE的连接方式,从服务器的ORACLE数据库中读取记录集,然后再插入本机中的Paradox数据库中。
由于字段结构不完全一样,所以需要逐个字段赋值。当查询结果有上万条纪录时,插入速度就奇慢。我计算了一下:二十多个表总共不到20万条纪录的转移竟要1个小时,太不正常了吧。
我用的语句是://从服务器中oracle旧表中取数据
with qryOld do
begin
close;
sql.clear;
sql.Add('select id1,id2 from table1');
open;
end;
//先清空本机中的paradox新表
with qryNew do
begin
close;
sql.clear;
sql.Add(' delete from table1');
execsql;
end;
//插入数据
with qryNew do
begin
while(not qryOld.Eof) do
begin
close;
sql.Clear ;
Sql.Add('insert into table1');
Sql.Add('(id1,id2)');
Sql.Add('values');
Sql.Add('(:id1,:id2)');
ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString; execSql;
qryOld.Next ;
end;
end;
大体就是这个模式。还有就是有些字段类型我用了强制转换。不知道速度慢的原因是什么,如何解决呢?
由于字段结构不完全一样,所以需要逐个字段赋值。当查询结果有上万条纪录时,插入速度就奇慢。我计算了一下:二十多个表总共不到20万条纪录的转移竟要1个小时,太不正常了吧。
我用的语句是://从服务器中oracle旧表中取数据
with qryOld do
begin
close;
sql.clear;
sql.Add('select id1,id2 from table1');
open;
end;
//先清空本机中的paradox新表
with qryNew do
begin
close;
sql.clear;
sql.Add(' delete from table1');
execsql;
end;
//插入数据
with qryNew do
begin
while(not qryOld.Eof) do
begin
close;
sql.Clear ;
Sql.Add('insert into table1');
Sql.Add('(id1,id2)');
Sql.Add('values');
Sql.Add('(:id1,:id2)');
ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString; execSql;
qryOld.Next ;
end;
end;
大体就是这个模式。还有就是有些字段类型我用了强制转换。不知道速度慢的原因是什么,如何解决呢?
毎次只取一条送一条、接続数据库需要化费時間。
Paradox表可以直接用文件名来打开,只要在文件名上加双引号就好,这样就可以直接用insert into table1 select id1, id2 from table2
因为DataSnap的原因,内存管理比BDE有效率。
with qryNew do
begin
close;
sql.Clear ;
Sql.Add('insert into table1');
Sql.Add('(id1,id2)');
Sql.Add('values');
Sql.Add('(:id1,:id2)');
while(not qryOld.Eof) do
begin
ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString; execSql;
qryOld.Next ;
end;
end;这样会快些,减少了开关数据库的时间,试试看
利用 TOP 记录数 来实现,不需要的记录就不用读取了,速度相当快了。
批量追加语句..我记不得语法了..
insert into Table4(编号,序号,姓名)//添加的字段必须跟下面SELECT语句出现的字段相同..select 编号,序号,姓名 from table2不好意思语法记得不是很清...^_^..
to SaKura2003(小飞仔) , fenglaile(风清飘):方法试了,效果不明显;
to xdf221(xdf221) ,shun3(天使鬼差):
由于 新旧表的结构字段名不完全一样,又不在一台机子上,所以不能这么用的;
to xw0071(xx) :我想先优先考虑用BDE,实在不行再用dbExpress;to ailibuli(愛理不理) ,tryanother() ,welllove88(寒林) :能否说的详细一点啊?
insert into Table4(编号,序号,姓名)
//添加的字段必须跟下面SELECT语句出现的字段相同..只要有对应就可以,名称可以不一样..select 编号,序号,姓名 from table2
我明白你的意思,如果是同一个库内两个字段结构相差无几的表之间导数据,你的方法很好!但是我现在是有的字段旧表没有而新表有,所以我要对它赋值;还有就是新库和旧库是在两台机器上,所以我想不能用吧。
1,将Oracle的一个表的数据读到本地数据集
2,启动一个循环,用语句一次追加一条记录到Paradox数据表。我建议在第2步的操作改成下列方法:
创建一个数据集对象,打开这个Paradox表,将Oracle的记录先全部追加到该数据集,然后一次性更新到实际表中,也就是
由oracle-->paradox 改成oracle-->DataSet(内存中)-->paradox
我现在是:旧库中A表5个字段,转入新库B表中,但是B表6个字段,第六个字段需要我自己赋值,不知能否用你的方法。
//从服务器中oracle旧表中取数据
with qryOld do
begin
close;
sql.clear;
sql.Add('select id1,id2 from table1');
open;
end;
//先清空本机中的paradox新表
with DataParadox do
begin
sql.clear;
sql.Add('SELECT * FROM TABLE2')
Open;
end;
//插入数据
with qryParadox do
begin
while(not qryOld.Eof) do
begin
append;
FieldByName('字段1').asString := qryOld.FieldByName('字段x').asstring;
end;
//:更新到数据库
qryParadox.UpdateAll;
end;
with qryNew do
begin
close;
sql.Clear ;
Sql.Add('insert into table1');
Sql.Add('(id1,id2)');
Sql.Add('values');
Sql.Add('(:id1,:id2)');
/////////////
prepare; while(not qryOld.Eof) do
begin
ParamByName('id1').AsString:=qryOld.FieldByName('id1').AsString;
ParamByName('id2').AsString:=qryOld.FieldByName('id2').AsString; execSql;
qryOld.Next ;
end;
////////////////////
unprepare; end;现在只要三四分钟就搞定了!
to truexf(小方) :我也试了你的方法,但是不能使用UpdateAll这个过程。明白了你的思路,如果找到这个过程的话,我想你的方法应该很快的。
不过呢这不要放假了吗!下班了,我也找到解决方案了,就先闪了。有兴趣的话节后再讨论吧!
呵呵!谢谢你的参与!结贴!