ado拼接sql中间如果有错误无法rollback

luodang_007 2017-12-19 09:13:34
qryTemp2是ADOQuery
1.如果sql一句一句执行,这个是没问题的,比如。这种情况能正常回滚,一句也插不进
qryTemp2.Connection.BeginTrans;
try
qryTemp2.Close;
qryTemp2.SQL.Text := 'insert sql1,这个不会出错';
qryTemp2.ExecSQL;

qryTemp2.Close;
qryTemp2.SQL.Text :='insert sql2,这个会出错';
qryTemp2.ExecSQL;

qryTemp2.Connection.CommitTrans;
except
on e:Exception do
begin
qryTemp2.Connection.RollbackTrans;
Exit;
end;
end;

2.如果是拼接sql,结果sql1还是插入了,没有回滚,为什么?有办法解决么,有时候按照1方案写太麻烦了
qryTemp2.Connection.BeginTrans;
try
qryTemp2.Close;
qryTemp2.SQL.Text := 'insert sql1,这个不会出错'+#13#10+
'insert sql2,这个会出错'; //这里加不加begin end都不会回滚
qryTemp2.ExecSQL;

qryTemp2.Connection.CommitTrans;
except
on e:Exception do
begin
qryTemp2.Connection.RollbackTrans;
Exit;
end;
end;
...全文
413 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dang 2017-12-20
  • 打赏
  • 举报
回复
你可以试一下
luodang_007 2017-12-20
  • 打赏
  • 举报
回复
终于搞定了,改成这样即可 qryTemp2.Close; qryTemp2.SQL.Text :=‘SET XACT_ABORT ON’+#13#10+ 'insert sql1,这个不会出错'+#13#10+ 'insert sql2,这个会出错'; //这里加不加begin end都不会回滚 qryTemp2.ExecSQL;
luodang_007 2017-12-20
  • 打赏
  • 举报
回复
引用 3 楼 a295281315 的回复:
你拼接成一个SQL语句 和 你开启事务一条一条执行效率是一样的 。 开始事务 ,只是将数据保存到内存中,内存是非常快的, 提交事务 服务器IO才会动作,将数据保存到硬盘 。
如果我的数据库是在阿里云上,程序在本地,通过外网连接,效率也一样么?谢谢
Mr Dang 2017-12-19
  • 打赏
  • 举报
回复
你拼接成一个SQL语句 和 你开启事务一条一条执行效率是一样的 。 开始事务 ,只是将数据保存到内存中,内存是非常快的, 提交事务 服务器IO才会动作,将数据保存到硬盘 。
luodang_007 2017-12-19
  • 打赏
  • 举报
回复
引用 1 楼 a295281315 的回复:

function execSQL(strSQL:string):Boolean;
begin
       try
               qryTemp2.Close;
              qryTemp2.SQL.Text := 'insert sql1,这个不会出错';
             qryTemp2.ExecSQL;               
       except
                result:=false;
                exit;
       end;
end;
封装成函数 判断函数返回值 是否回滚
谢谢主要是不想多次执行ExecSQL,总感觉如果能一次执行效率可能高些 另外因为要兼容2000,所以拼成一个sql的时候也没法加try catch 不知道ado有没什么属性设置后可以满足这种要求
Mr Dang 2017-12-19
  • 打赏
  • 举报
回复

function execSQL(strSQL:string):Boolean;
begin
       try
               qryTemp2.Close;
              qryTemp2.SQL.Text := 'insert sql1,这个不会出错';
             qryTemp2.ExecSQL;               
       except
                result:=false;
                exit;
       end;
end;
封装成函数 判断函数返回值 是否回滚

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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