ado bug?!! 各位看看,我不是随便说的!!(50分)

  • 主题发起人 主题发起人 navy
  • 开始时间 开始时间
N

navy

Unregistered / Unconfirmed
GUEST, unregistred user!
前几天,我发帖子问事务中循环插入数据库的失败问题,今天在同事的帮助下好像解决了.
居然是sql语句不能分开写的问题!
code如下:
var i:integer;
begin
adoconnection1.begintrans;
try
for i:=0 to 9 do
begin
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('insert into mytable1 values ( '); --??
adoquery1.sql.add(':name,:address)'); --??
adoquery1.parameters[0].value:='name'+inttostr(i);
adoquery1.parameters[0].value:='addr'+inttostr(i);
adoquery1.execsql;
end;
adoconnection1.committrans;
except
adoconnection1.rollbacktrans;
end;
end;
各位认为??的两句有问题吗?
执行该段代码,执行结果只有最后一句成功,即只有name9,addr9 插入数据库成功!!
如果 将adoquery1.sql写成一句:
adoquery1.sql.add('insert into mytable1 values (:name,:address)');
执行则成功,10条记录都插入成功!!
是sql数据库要求?delphi的ado问题(bug)?
环境:win2k+d5 enterprise +d5 update1,d5 ado update1+msado v2.6+mssql server7.

 
是的,我也碰到过这个问题。呵呵
 
你可以把所有的sql语句合成一个大的string,中间用'go'分割开,然后一次性送到query
里面去执行
 
我也碰到个这个问题
当时的解决方法是:
另外定义一个 str:stirng;

begin
adoconnection1.begintrans;
try
for i:=0 to 9 do
begin
adoquery1.close;
adoquery1.sql.clear;
str:='insert into mytable1 values ( '
str:=str+':name,:address)'
adoquery1.sql.add(str); //这样
adoquery1.parameters[0].value:='name'+inttostr(i);
adoquery1.parameters[0].value:='addr'+inttostr(i);
adoquery1.execsql;
end;
adoconnection1.committrans;
except
adoconnection1.rollbacktrans;
end;
end;


 
我也碰过类似问题,
我估计是这条数据还未写入数据库,最后是丢失掉了!
我还碰到一个问题,就是ADO写入数据库后如果马上进行操作的话,会什么结果都没有。
SQL语句如下:
insert into table2 select * from table1
insert into table3 select * from table2
如果两条语句连续执行的话就会产生table2里面有数据存在,但table3就没有任何数据!
我只能操作完后再等待几秒钟才不会造成数据丢失。
但这只能治标,我不懂象此类问题该如何解决?
关注。
 
嘿!我问这个问题时,没人理,现在好像谁都碰过这个事!也绕圈解决了!
dfw啊,互相帮助才能共同进步啊.虽然得益的是我们这些菜鸟!!
谢谢!!!
 
我用ADO的时候
一般都是将SQL语句放在一个STRING中,这样方便
 
adoquery1.sql.add('insert into mytable1 values (:name,:address)');
这种带参数的写法我地直都没采用,感觉它问题很多,我用的是动态组合SQL的方法。
还没遇到过问题。
procedure TfrmScAdmin.btbQueryPage2Click(Sender: TObject);
var
strBaseSql, strSql: string;
begin
inherited;
strBaseSql := 'SELECT U.userType,U.userNo FROM TscUsers U INNER JOIN ThrEmployees E ' +
' ON U.userNo = E.empNo WHERE U.status<>''D'' and U.userType=''U''';

strSql := '';

if trim(edtUser.Text) <> '' then
strSql := strSql + ' and U.userNo=''' + edtUser.Text + '''';
if trim(edtDeptNo.Text) <> '' then
strSql := strSql + ' and E.deptNo=' + edtDeptNo.Text;

DMSC.cdsScUsers.Close;
DMSC.cdsScUsers.CommandText := strBaseSql + strSql;
DMSC.cdsScUsers.Open;
end;
 
有没有人能解释该问题?
这是d5 ado 的bug吗?
 
想不到ADO的sql存在这样的问题。ADO不是直接将sql中的字符串发送给数据库,
而是根据字符串生成一些数据库的sql请求。各位想调试sql,不妨用MS SQl,
它有一个事件探测器,可以监控所有收到的sql请求。
 
>>有没有人能解释该问题? 这是d5 ado 的bug吗?
应该没人知道这是不是BUG,只是你知道怎么可以用就行了。。。
 
多人接受答案了。
 
后退
顶部