slx_7(稻草人) 你用的是 Oracle 你不是用 ADO 吧,要不你使用的 OLE DB provider 是 ODBC。不过在 Oracle 下没问题是不是就说明和 D5 无关呢(我以为是 D5\D6 的 Bug)?标准的Sql insert 的后面带着into,但 insert XX values... 是 msSQL 的简写,绝没问题,这样的速写还有:delete XXX,select *from XXX...谢谢你的测试和提醒。
改成这样试试:var i: integer; begin ADOConnection1.Open; with ADOQuery1, ADOQuery1.SQL do begin for i:=1 to 10 do begin ADOConnection1.BeginTrans; Close; Clear; Add('insert'); Add('test'); // Add('values('('+inttostr(i)+')'); Add('values('''+inttostr(i)+''')'); ExecSQL; ADOConnection1.CommitTrans; end; end; end;
你使用adodataset试试我现在正在网吧我会测试你的程序的!adoquery不如adodataset好用 在ado中adoquery只是为了让使用query的人比较熟悉而已! var i: integer; begin ADOConnection1.Open; with ADOdataset do begin ADOConnection1.BeginTrans; for i:=1 to 10 do begin Close;CommandText:=''; CommandText:='insert into test values('+intostr(i)+')' ExecSQL; end; ADOConnection1.CommitTrans; end; end;
如果 OLE DB for ORACLE 没问题,我想应该不是 Delphi 的问题,可能是 OLE DB for msSQL 的问题?我试试... 哈哈,我改用 OLE DB for ODBC 连接时,没问题了 看来还真的是 OLE DB for msSQL Bug ,可能在 ICommandPrepare 接口中但是这个 Bug 居然能绕过 SQL 语句执行 Rollback ?!!其中是不是还有其他问题??希望各位朋友指出。谢谢
其实例子很简单,不知道那位朋友有兴趣试试,相信你也会发现问题的。其实在例子中只要将 ADOQuery1 的 ParamCheck 属性设置成 Flase 就正常了(但是我的程序中大量使用了 Params 不好改了)。我刚在 D6 中试过,问题依旧:(我还没吃饭呢,只求见你一面:)
你的SQL之间没有空格。
for i:=1 to 10 do
begin
Close; Clear;
Add(' insert Into ');
Add(' test ');
Add(' values ('+inttostr(i)+')');
ExecSQL;
end;
我希望解答的朋友最好能先测试看,因为我已经代码写出来了,不会浪费你的太多时间的。:)谢谢。
不过只是数据库不同,我用的是Oracle的,但这不会有问题吧(提醒一句,用标准的Sql,insert 的后面带着into)。
i: integer;
begin
ADOConnection1.Open;
with ADOQuery1, ADOQuery1.SQL do
begin
for i:=1 to 10 do
begin
ADOConnection1.BeginTrans;
Close;
Clear;
Add('insert');
Add('test');
// Add('values('('+inttostr(i)+')');
Add('values('''+inttostr(i)+''')');
ExecSQL;
ADOConnection1.CommitTrans;
end;
end;
end;
http://www.csdn.net/expert/topic/173/173577.shtm
http://www.csdn.net/expert/topic/160/160314.shtm我相信绝对不是我的 SQL 语句或程序流程的原因。我写的测试例子就像我写出的程序一样多,绝没有其他代码,请不要怀疑。我希望各位能用我给出的方法代码来测试验证,因为我在计算机前调试了 6 个小时了,而我又不是没经验或太笨的人。
在ado中adoquery只是为了让使用query的人比较熟悉而已!
var
i: integer;
begin
ADOConnection1.Open;
with ADOdataset do
begin
ADOConnection1.BeginTrans;
for i:=1 to 10 do
begin
Close;CommandText:='';
CommandText:='insert into test values('+intostr(i)+')'
ExecSQL;
end;
ADOConnection1.CommitTrans;
end;
end;
另外发现一个奇怪的现象,用 TADOCommand 时,执行 CommitTrans 完后,程序将无声无息的自动退出,不过现在没时间在研究这问题了。
to manboo(横刀) 我也试过 TADOdataset 和 TADOCommand,因为是昨天试的所以情节有些忘了。是这样的,TADOdataset 和 TADOCommand 是可以,但是它的 CommandText 是Widestring 型的,我有不少 SQL 语句很长,用 String 很不方便(用 SQL.Add 很好)。
另外我要特别说明的是用 TADOQuery 只用一句 Add 加入语句,运行结果是正常的。我已经用修改 paramCheck 属性的方法完成了现在的程序(当然有点麻烦),但我不甘心,希望有朋友能给我说明这个问题所在。:)
迟些再结帖,谢谢。
参数设置都将原来的参数值覆盖掉所以当你提交时只有最后一次的参数设置存在,而你要是设置
PARAMCHECK参数为TRUE,那么DELPHI会在每次设置参数时检查是否已经设置了如有则将此参数
作为一条新语句设置
PARAMCHECK = True时,ADO Express 执行了 TParameters.InternalRefresh 调用,问题可能在这里。
Provider=MSDAORA.1;Password=***;User ID=***;Data Source=dbname;Persist Security Info=True。
其它的和你的是一致的,一个ADOConnection,一个ADOQuery,代码也是一致的或许是由于事务问题?呵呵,把事务去掉试验一下如何?
我也认为是事务的原因,但是在 Trace 里看不到任何 Rollback Tran 语句,难到她绕过了 SQL 来执行回滚?!奇怪。
我写的这段代码只是演示错误而已,但是是我实际中遇到这个问题分析后的简化代码。
哈哈,我改用 OLE DB for ODBC 连接时,没问题了
看来还真的是 OLE DB for msSQL Bug ,可能在 ICommandPrepare 接口中但是这个 Bug 居然能绕过 SQL 语句执行 Rollback ?!!其中是不是还有其他问题??希望各位朋友指出。谢谢
push