while not adoquery1.Eof do
begin
adoquery2.Close;
adoquery2.sql.clear;
adoquery2.sql.add('update table1 set id='+adoquery1.fieldbyname('id').asstring+'');
adoquery2.sql.add('where 地址 like ''%'+adoquery1.Fieldbyname('address').asstring+'%''');
adoquery2.ExecSQL;
adoquery1.Next;
end;
上面语句原来adoquery1连sql server2000,adoquery2连dbf数据库
后来我把dbf的数据先导进sql server2000,再运行以上语句,结果比原来还慢很多。
请问各位高手这是什么原因?有什么解决方法?
begin
adoquery2.Close;
adoquery2.sql.clear;
adoquery2.sql.add('update table1 set id='+adoquery1.fieldbyname('id').asstring+'');
adoquery2.sql.add('where 地址 like ''%'+adoquery1.Fieldbyname('address').asstring+'%''');
adoquery2.ExecSQL;
adoquery1.Next;
end;
上面语句原来adoquery1连sql server2000,adoquery2连dbf数据库
后来我把dbf的数据先导进sql server2000,再运行以上语句,结果比原来还慢很多。
请问各位高手这是什么原因?有什么解决方法?
解决方案 »
- 请问indy idtcpclient 从服务器端下载文件缺少文件最开始的两个字符,是怎么回事?
- 如何用delphi实现金山词霸迷你背单词那样的工具?
- Delphi7不能容忍的BUG!
- 如何解决win98下delphi7+access计算数据慢的原因!急!急!急!
- 客户端/服务器问题
- 用delphi怎样生成 .lnk文件(各种快捷方式文件)
- 对网络办公的讨论WEB-OA
- 同一个MEMO中的文本显示为什么不同?
- 怎样使用计算机实现自动推箱子功能?怎样得到最优解?
- 请问 MDI 主窗体 上有一个 panel , 但 Mdi 子窗体无法显示在 panel 的上面 ,如何解决 ???? 急!!!!
- 问一个Qreport问题,愁死了
- IntraWeb应用的问题?-Frame中是否可以使用WebApplication变量?
if not adoquery2.Prepared then adoquery2.Prepared:=true;
adoquery2.sql.add('update table1 set id='+adoquery1.fieldbyname('id').asstring+'');
adoquery2.sql.add('where 地址 like ''%'+adoquery1.Fieldbyname('address').asstring+'%''');
adoquery2.ExecSQL;
直接这样就OK了
adoquery2.sql.clear;
adoquery2.sql.add('update table1 set id=:id')
ADOQuery2.Parameters.ParamByName('id').Value:=adoquery1.fieldbyname('id').asstring;
首先ADOQUERY2设置成缓存更新,
再查出ADOQUERY1的结果集,然后再查出ADOQUERY2的结果集,然后循环
while not adoquery1.Eof do
begin
if adoquery2.locate('地址',adoquery1.fieldbyname('address').asstring,
[非精确匹配的OPTION])then
adoquery2.fieldbyname('id').asstring=adoquery1.fieldbyname('id').asstring;adoquery1.Next;
end;
adoquery2.upplyupdate;
var str1,str2:string;
while not adoquery1.Eof do
begin
str1:=adoquery1.fieldbyname('address').asstring;
adoquery2.first;
while not adoquery2.eof do
begin
str2:=adoquery2.fieldsbyname('地址').asstring;
if pos(str1,str2)>0 then
adoquery2.fieldbyname('id').asstring=adoquery1.fieldbyname('id').asstring;
adoquery2.next;
end;
adoquery1.Next;
end;
adoquery2.upplyupdate;
实现是没问题,就是速度不知道会怎样,不管怎么说肯定会比写SQL语句快。
而且要快很多。。
因为每次开关数据连接都需要花时间的
不过服务器不是本机的话就要快些。。
如果实在不行的话就把query1,query2分成两个进程这样绝对快,不过要复杂些
当adoquery1和adoquery2在不同的数据库时,运行的时间是7分钟,
但同在sql server2000时就要40多分钟,两个的区别太大了,所以感觉不能接受,请原谅。请问还有没有其他的方法啊?
楼上说分两个进程,请问如何实现?
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;DATABASE=C:\' --c:\是目录
,'select * from [客户资料4.dbf]') --客户资料4.dbf是文件名
--*/--/* dBase III文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;DATABASE=C:\'
,'select * from [客户资料3.dbf]')
--*/--/* FoxPro 数据库
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
'select * from [aa.DBF]') --aa.dbf是文件名
=============================================已foxpro为例:
update openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
'select * from [aa.DBF]')
set id=b.id from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
'select * from [aa.DBF]') a, orders b
where a.addr=b.addr
这样。写一个存储过程吧,(table1为query1对应的表,tabe2 为query2对应的表)
DECLARE cursor_ cursor for select id,address from table1
declare @id nvarchar(10),@address nvarchar(10)
open cursor_
fetch next from cursor_ into @id,@address
while @@fetch_status=0
begin
update table2 set id=@id where address like '%'+@address+'%'
fetch next from cursor_ into @id,@address
end
close cursor_
deallocate cursor_
游标的速度不怎么样,但我想肯定会比原来两中方法好的多,试试。
如果再不行我也没办法了,呵呵!
我以后真正运行时table2最少都有10万条记录,有时甚至有100万条。table1的记录以后都会增加,到时可能会有10万条左右。
救命啊,请各位大哥帮帮小弟呀!
可以直接用一条sql更新。