各位朋友帮帮忙,关于 ADO 的,急!!!

qkl 2001-07-08 12:27:42
我在 D5(sp1) + ADO(sp1,sp2) + ms SQL7 有如下做法:
在 msSQL 里建立表:
Create Table [dbo].[test] ( I [int] )
然后在 D5 中新建一个工程:一个窗口,窗口中加入 TADOConnection、TADOQuery各一个,将 TADOConnection 的连接 string 设置好,在将 TADOQuery 连上(TADOQuery 不改变其他任何属性),在放入一个 TButton ,在 TButton 的 Click 事件中加入如下代码:
var
i: integer;
begin
ADOConnection1.Open;
with ADOQuery1, ADOQuery1.SQL do
begin
ADOConnection1.BeginTrans;
for i:=1 to 10 do
begin
Close; Clear;
Add('insert');
Add('test');
Add('values('('+inttostr(i)+')');
ExecSQL;
end;
ADOConnection1.CommitTrans;
end;
end;
运行。从流程,以及 Trace 中看,她都是准确无误的,查查数据库看 select * from text ,a-e!!!你会发现只 insert 了第 10 条纪录,也就是最后一条,见鬼了!!

兄弟姐妹叔叔阿姨请释放你们的爱心,帮帮这个在空调房中受冻挨饿的蹩脚程序员吧!!
...全文
198 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
slx_7 2001-07-09
  • 打赏
  • 举报
回复
我用的是OLE DB for ORACLE啊,环境是Delphi 5,ConnectionString:
Provider=MSDAORA.1;Password=***;User ID=***;Data Source=dbname;Persist Security Info=True。
其它的和你的是一致的,一个ADOConnection,一个ADOQuery,代码也是一致的

或许是由于事务问题?呵呵,把事务去掉试验一下如何?
qkl 2001-07-09
  • 打赏
  • 举报
回复
to WangYan(一研) 我再 Trace 里看到的语句(全部从程序开始到结束,看了几次),两中情况下 SQLserver 执行的语句几乎相同,不存在多语句和少语句的现象,甚至每句语句都相同。还有你的分析也不能解释为什么用 PARAMCHECK=True 时,用将整句 SQL 用一句 Add 添加(语句中即使有参数),执行结果是成功的。

我注意到,将 PARAMCHECK 设置成 False 和 True,ADO Express 执行流程的差别是:
PARAMCHECK = True时,ADO Express 执行了 TParameters.InternalRefresh 调用,问题可能在这里。
WangYan 2001-07-09
  • 打赏
  • 举报
回复
其实这个问题的关键在事务处理上由于你没有将PARAMCHECK属性置成FALSE,所以你的每一次
参数设置都将原来的参数值覆盖掉所以当你提交时只有最后一次的参数设置存在,而你要是设置
PARAMCHECK参数为TRUE,那么DELPHI会在每次设置参数时检查是否已经设置了如有则将此参数
作为一条新语句设置
qkl 2001-07-09
  • 打赏
  • 举报
回复
上一讲述有误
to manboo(横刀) 我也试过 TADOdataset 和 TADOCommand,因为是昨天试的所以情节有些忘了。是这样的,TADOdataset 和 TADOCommand 是可以,但是它的 CommandText 是Widestring 型的,我有不少 SQL 语句很长,用 String 很不方便(用 SQL.Add 很好)。
另外我要特别说明的是用 TADOQuery 只用一句 Add 加入语句,运行结果是正常的。

我已经用修改 paramCheck 属性的方法完成了现在的程序(当然有点麻烦),但我不甘心,希望有朋友能给我说明这个问题所在。:)
迟些再结帖,谢谢。
qkl 2001-07-09
  • 打赏
  • 举报
回复
我也试过 TADOdataset 和 TADOCommand,问题同样。
另外发现一个奇怪的现象,用 TADOCommand 时,执行 CommitTrans 完后,程序将无声无息的自动退出,不过现在没时间在研究这问题了。
qkl 2001-07-09
  • 打赏
  • 举报
回复
我的问题进入你的锁定区了吗?

希望你能关心她
push
qkl 2001-07-09
  • 打赏
  • 举报
回复
如果 OLE DB for ORACLE 没问题,我想应该不是 Delphi 的问题,可能是 OLE DB for msSQL 的问题?我试试...
哈哈,我改用 OLE DB for ODBC 连接时,没问题了
看来还真的是 OLE DB for msSQL Bug ,可能在 ICommandPrepare 接口中

但是这个 Bug 居然能绕过 SQL 语句执行 Rollback ?!!其中是不是还有其他问题??希望各位朋友指出。谢谢
qkl 2001-07-09
  • 打赏
  • 举报
回复
把事务去掉是没问题的
我也认为是事务的原因,但是在 Trace 里看不到任何 Rollback Tran 语句,难到她绕过了 SQL 来执行回滚?!奇怪。
我写的这段代码只是演示错误而已,但是是我实际中遇到这个问题分析后的简化代码。
manboo 2001-07-08
  • 打赏
  • 举报
回复
你使用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;
qkl 2001-07-08
  • 打赏
  • 举报
回复
有哪位有建议或方法的请.....
期待中。。。。。

谢谢你的参与和帮忙:)
qkl 2001-07-08
  • 打赏
  • 举报
回复
Trace 中看观察到的两次( 不成功 ParamCheck := True 和 成功 ParamCheck := Flase )运行结果所执行的 SQL 几乎一样,不存在多语句和少语句的现象。

这样的问题不知各位有没有留意,在此前已有过类似的帖子:
http://www.csdn.net/expert/topic/173/173577.shtm
http://www.csdn.net/expert/topic/160/160314.shtm

我相信绝对不是我的 SQL 语句或程序流程的原因。我写的测试例子就像我写出的程序一样多,绝没有其他代码,请不要怀疑。我希望各位能用我给出的方法代码来测试验证,因为我在计算机前调试了 6 个小时了,而我又不是没经验或太笨的人。
zfmich 2001-07-08
  • 打赏
  • 举报
回复
改成这样试试:

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;
ghz2000 2001-07-08
  • 打赏
  • 举报
回复
你看看取消你的事务处理看看
qkl 2001-07-08
  • 打赏
  • 举报
回复
朋友再给点提示吧
qkl 2001-07-08
  • 打赏
  • 举报
回复
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...

谢谢你的测试和提醒。
slx_7 2001-07-08
  • 打赏
  • 举报
回复
老兄,你别开玩笑啊,我按照你的做法足足10分钟那,可是,一点问题也没有!
不过只是数据库不同,我用的是Oracle的,但这不会有问题吧(提醒一句,用标准的Sql,insert 的后面带着into)。
qkl 2001-07-08
  • 打赏
  • 举报
回复
to Wingsun(孙春阳) 我加了空格还是没用(其实即使这样行,这也不能解释 ParamCheck 属性设置成 Flase 运行正常的现象)。
我希望解答的朋友最好能先测试看,因为我已经代码写出来了,不会浪费你的太多时间的。:)

谢谢。
Wingsun 2001-07-08
  • 打赏
  • 举报
回复
错错错!大错啊!
你的SQL之间没有空格。
for i:=1 to 10 do
begin
Close; Clear;
Add(' insert Into ');
Add(' test ');
Add(' values ('+inttostr(i)+')');
ExecSQL;
end;
qkl 2001-07-08
  • 打赏
  • 举报
回复
to Java_SCU(Java) 我相信我的SQL语句没有错的,有错的话会触发一个异常的,但是没有。
其实例子很简单,不知道那位朋友有兴趣试试,相信你也会发现问题的。其实在例子中只要将 ADOQuery1 的 ParamCheck 属性设置成 Flase 就正常了(但是我的程序中大量使用了 Params 不好改了)。我刚在 D6 中试过,问题依旧:(

我还没吃饭呢,只求见你一面:)
Java_SCU 2001-07-08
  • 打赏
  • 举报
回复
应该是可以的,但是你的SQL语句就有错误,应该会报错呀!
改为
insert into test values(n)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧