線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1254
推到 Plurk!
推到 Facebook!

sql server中的事务写法

尚未結案
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-08 14:48:16 IP:218.72.xxx.xxx 未訂閱
各位大大:     小弟又有问题了,下面的这一段code我用了delphi的事务处理,如果我想把这段code 完全改成用sql server的事务处理,请教该如何写,不胜感激!    first.Database1.StartTransaction; //开始事务 try query1.close; query1.sql.clear; query1.sql.add('INSERT INTO'); query1.sql.add('server.db.dbo.ml'); query1.sql.add('SELECT *'); query1.sql.add('FROM ml_temp1'); query1.prepare; query1.execsql; query1.close; query1.sql.clear; query1.sql.add('delete table aaa *'); query1.prepare; query1.execsql; query1.close; query1.sql.clear; first.Database1.Commit; //提交事务 except begin Application.Messagebox('发生错误,不能正常存盘!','信息',mb_Ok+mb_Iconinformation); first.Database1.Rollback; application.Terminate; end;     發表人 -
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-08 20:37:30 IP:218.32.xxx.xxx 未訂閱
試試看:
begin
  begin tran
  INSERT INTO server.db.dbo.ml SELECT * FROM ml_temp1
  if @@error!=0 goto error
  delete table aaa *
  if @@error!=0 goto error
  commit transaction
  return
error:
  raiserror 40001 '发生错误,不能正常存盘!'
  rollback transaction
end
luowy651
高階會員


發表:257
回覆:313
積分:114
註冊:2003-04-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-09 12:35:38 IP:218.72.xxx.xxx 未訂閱
引言: 試試看:
begin
  begin tran
  INSERT INTO server.db.dbo.ml SELECT * FROM ml_temp1
  if @@error!=0 goto error
  delete table aaa *
  if @@error!=0 goto error
  commit transaction
  return
error:
  raiserror 40001 '发生错误,不能正常存盘!'
  rollback transaction
end
非常感谢Mickey大大的解答,其实我的主要目的是想用sql server的事务处理功能来代替delphi中的事务处理功能,我还想问一下: 1.我听说最好能将"if @@error!=0 goto error"再加上@@rowcount的判断会更保险,是这样吗?但不知该如何加上。有一本书是这样写的“if @@error!=0 or @@rowcount<>1 goto error ”,但我觉得似乎应该是 “if @@error!=0 or @@rowcount<>0 goto error ”,请问到底是怎样的 2.raiserror 40001 '发生错误,不能正常存盘!' 这一句提示语能在我所编的delphi软体中显示吗(即相当于application.messagebox功能)?如果不能,该用什么方法解决? 3.return是返回到哪里? 对不起,我入行不深,麻烦各位大大了 我已将其改成在delphi的code,如下,有问题吗?
  adoquery1.sql.add('begin');
  adoquery1.sql.add('begin tran');
  adoquery1.sql.add('INSERT INTO server.db.dbo.ml SELECT * FROM ml_temp1');
  adoquery1.sql.add('if @@error!=0 goto error');
  adoquery1.sql.add('delete table aaa *');
  adoquery1.sql.add('if @@error!=0 goto error');
  adoquery1.sql.add('commit transaction');
  adoquery1.sql.add('return');
  adoquery1.sql.add('error:');
  adoquery1.sql.add('raiserror 40001 '发生错误,不能正常存盘!'');
  adoquery1.sql.add('rollback transaction');
         adoquery1.execsql;
         adoquery1.close;
         adoquery1.sql.clear;
    
end
發表人 - luowy651 於 2004/04/09 12:40:28< > < > 發表人 - luowy651 於 2004/04/09 13:47:58 發表人 - luowy651 於 2004/04/09 13:52:34
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-09 22:44:19 IP:218.32.xxx.xxx 未訂閱
1. @@rowcount 是....交易中之"受影響"資料列數, 若加入 if 條件也無訪. 2. raiserror 會顯現在前端, 像 Delphi 中 raise Exception.Create(...) 一樣. 3. adoquery1.sql.add('raiserror 40001 '#39'发生错误,不能正常存盘!'#39); // #39 = ' 4. ADOQuery.SQL 最後好像少了 "end". 發表人 - Mickey 於 2004/04/09 22:47:05
系統時間:2024-09-09 18:05:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!