關於事務處理。。。(100分)

  • 主题发起人 主题发起人 Framer!
  • 开始时间 开始时间
F

Framer!

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥幫我看一下,這是我第一次涉及事務處理,就出現了問題:
procedure TForm1.Button1Click(Sender: TObject);
begin
cn.BeginTrans;
try
adoset.Append ;
adoset.FieldByName('name').Value :=edit1.Text ;
adoset.Post ;
cn.CommitTrans ;
except
cn.RollbackTrans ;
raise;
end;
end;
我本想按一下按鈕就添加一條 EDIT1.TEXT 到數據庫裡面,
但是當我的 EDII.TEXT 內容超過字段長度時程序就截取了
前面的字符,並沒有報錯或者說回滾。我該怎麼做?
 
因为这时候并不引发异常,所以也就不执行
cn.RollbackTrans ;
这条语句了。
你可以在
adoset.FieldByName('name').Value :=edit1.Text ;
这条语句前加校验不就行了吗,不需要用事物进行处理。

 
是这样的,这个字符太长要你自己写程序定的,可在EDIT中设定MAXLENGTH
 
你按了确定输入时程序还没发现你有错呢。
自己写片代码限edit1.text中的长度好了。
 
DELPHI不會這麼死板吧?我以為隻要發生錯誤都會產生 RollBack,
我想請問一下,這個到底有什麼用處?
在什麼情況下才會發生?
[ 我想知道如果發生了我們沒有預料到的錯誤,該怎麼辦?]
 
為什麼沒有人解釋一下呢!
我想萬一發生了錯誤該怎麼辦?
而且這個錯誤是沒有預料到的!
 
对多次访问数据库,比如要操作多个表,如对其中一个表操作产生错误,那么要求对其他
表的操作也不发生,此时你可以用事务回滚,此次操作就什么也不作了!
 
To:Sinpo/All
能否給一個事務回滾的例子給我參考!
謝謝!
vbframer@sina.com
 
procedure TForm1.Button1Click(Sender: TObject);
begin
cn.BeginTrans;
try
adoset1.Append ;
adoset1.FieldByName('name').Value :=edit1.Text ;
adoset1.Post ;
adoset2.Append ;
adoset2.FieldByName('address').Value :=edit2.Text ;
adoset2.Post ;
cn.CommitTrans ;
except
cn.RollbackTrans ;
raise;
end;
end;
以上只有adoset1,adoset2的操作都成功,才会提交到数据库!任其一产生错误,
都不改变数据库内容。
 
后退
顶部