请问在ado connection的Execute方法发出无反回的sql命令,怎样得到此sql语问执行完毕的指令!(100分)

  • 主题发起人 主题发起人 jfsoft
  • 开始时间 开始时间
J

jfsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
请问在ado connection的Execute方法发出无反回的sql命令,怎样得到此sql语问执行完毕的指令!

我在用ADO向access发出DELETE,INSERT INTO,UPDATE等sql语句时发现当连续向acdess
数据库传递sql语句时,sql语句并不是一条一条按顺序执行,而是只发出指令后,便
执行下一条语句。这样使我的程序出现了很大的错误,在实验中发现只要每条sql语句
后执行sleep(5000),延时后错误消失。所以问题出在上一步还未执行完毕,下一步
紧接着执行的缘故。现在我想ado能不能有这样的属性判断上一步的sql已执行完毕!
请各位数据库高手多多指教!
 
connection.Execute 的第3个参数如果不设置,是同步执行的,就是
说执行完才返回。

 
我没设置第三个参数呀!
附原代码
var
recc:integer;
.....
ConnHldCjg.Execute('DELETE * FROM P1',recc); //将CJG的P1表清空
Application.ProcessMessages;
CONNHLDFILELINK.Execute('INSERT INTO p1 IN '+''''+'E:/soft/HLDCJGLR/LINK/HLDcjg.mdb'+''''+
' SELECT * FROM p2',recc); //追加连结文件到表p1中
sleep(5000); //这行竟成了关键:-<
...
...
 
如果写在存储过程当中或进行事务提交怎么样?
 
你这段代码写得不全,连哪里出错都没有指出。
sleep(5000); 之后执行什么语句呢?应该是后面的语句才导致错误吧?

另外,你用两个Connection,
ConnHldCjg.Execute(...
CONNHLDFILELINK.Execute(...

相当于两个用户进行连接,当然无法保证上一个操作执行完毕,
为什么要这样呢?改成一个conn就可以了吧?
 
谢谢各位的答复:
用两个conn是因为用到了两个不同的库,insert into 语句是从当前库追加到另一个库的
p1表中,不知有没有好办法用一个conn

现附上原代码,刚从vb 转向delphi,各位不要笑我的编码

procedure TForm1.Button1Click(Sender: TObject);
var
FileNameAll,ImgFileName,JTH:string;
FileNameLen:integer;
connstr:string;
recc:integer;
imgnum,intpage,code:integer;
pagetemp:string;
begin
rshldlinkinfo.First;
ConnHldCjg.Execute('delete * from p2');
while not RSHldLinkInfo.Eof do
begin
label1.Caption:='正在转换'+rshldlinkinfo.Fieldbyname('zymc').AsString;
button1.Enabled:=true;
FileNameAll:=trim(rshldlinkinfo.Fieldbyname('zymc').AsString);
FileNameLen:=length(FileNameAll);
ImgFileName:=copy(FileNameAll,1,FileNameLen-3); //此处的imgfile不完整
JTH:=copy(FileNameAll,FileNameLen-3+1,3);

connstr:='Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+'//Server/WorkDbf/HLDCJG/'+JTH+'/'+FileNameAll+'.MDB;'+
'Persist Security Info=False';
if stopen in CONNHLDFILELINK.State then
begin
CONNHLDFILELINK.Connected:=false;
end;
CONNHLDFILELINK.ConnectionString:=CONNSTR; //打开连结文件的CONN
CONNHLDFILELINK.Open;
RSHldLinkFileP2.Connection:=CONNHLDFILELINK;
RSHldLinkFileP2.CommandType:=cmdTable;
RSHldLinkFileP2.CommandText:='p2';
RSHldLinkFileP2.Open;
ConnHldCjg.Execute('DELETE * FROM P1',recc); //将CJG的P1表清空
Application.ProcessMessages;

CONNHLDFILELINK.Execute('INSERT INTO p1 IN '+''''+'E:/soft/HLDCJGLR/LINK/HLDcjg.mdb'+''''+
' SELECT * FROM p2',recc); //追加连结文件到正表中

//原来这有一行SQL ConnHldCjg.Execute('update p1 from page="000"+p1.page');
(现在临时补的,可能语法有错,不过原来在前面加Sleep(5000)时执行正确,否则这条语句无效)

sleep(5000);
rshldcjgp1.Active:=false;
rshldcjgp1.Active:=true; //这里打开是为了让RSHLDCJGP1得到最新的数据
我在把RSHLDCJGP1的CursorLocation设为CluseClient
时发现RSHLDCJGP1得到的RecordCount数竟然不对,显示为
827条实际在access中为830条不知何故???只能将CursorLocation改为ClUseServer
可又不支持REFRESh功能.

RSHldCjgP1.First;
val(ImgFileName,imgnum,code);
while not RSHldCjgP1.Eof do
begin
pagetemp:=RSHldCjgP1.fieldbyname('page').AsString;
val(pagetemp,intpage,code);
pagetemp:=FillUpZero(trim(IntToStr(imgnum+intpage-1)));
rshldcjgp1.Edit;
RSHldCjgP1.fieldbyname('page').AsString:=pagetemp;
rshldcjgp1.Post; //************不加SLeep(5000)时在这行出错,估计是上面的sql还未执行完!
label2.Caption:='第'+inttostr(rshldcjgp1.RecNo)+'/'+inttostr(recc);
Application.ProcessMessages;
RSHldCjgP1.Next;
end;
ConnHldCjg.Execute('INSERT INTO p2 SELECT * FROM p1');
RSHldLinkInfo.Next
end;
ShowMessage('ok');
exit;

end;
 
唉!一贴又是一大堆。

问题:
1.那一句会有错
2.把sleep加在哪里就可以不出错(加在出错的那一句前面?后面?)
 
抱歉,未将问题说清楚,上面的原代码就一个sleep,不加这句就在有//***的地方出错

CONNHLDFILELINK.Execute('INSERT INTO p1 IN '+''''+'E:/soft/HLDCJGLR/LINK/HLDcjg.mdb'+''''+
' SELECT * FROM p2',recc); //追加连结文件到正表中

********>这里原来也有一句sleep(5000) 不加下面注释中的sql语句出错,正因为这样下面
的 while not RSHldCjgP1.Eof do 也是为了弥补下面这行的功能,现下一行已不用.
|
|-> //原来这有一行SQL ConnHldCjg.Execute('update p1 from page="000"+p1.page');
(现在临时补的,可能语法有错,不过原来在前面加Sleep(5000)时执行正确,否则这条语句无效)


sleep(5000); //*****这行不加---------------------------
rshldcjgp1.Active:=false; |
..... |
|
RSHldCjgP1.fieldbyname('page').AsString:=pagetemp; |
rshldcjgp1.Post; //***********这行出错 <-------------|
 
关键是:
1.是否可以按顺序执行。
2.能否得到执行完毕的信息。
 
全部使用一个connection才好
 
jfsoft:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部