劉彥青編譯 來自:yesky
使用SQL-Transaction類和.NET提供的異常處理機制,我們就能夠以一種可靠的方式處理資料庫運行中的問題和發現系統異常。這篇小文章將解釋交易處理和異常處理的概念和用法。
什麼是事務。
交易處理是由以一個單一的邏輯單位完成的一系列操作,它可以由一系列的SQL語句、SELECT、INSERT、UPDATE、DELETE組成,如果在該單位包含的操作執行完畢後沒有發生錯誤,那麼它對資料庫所作的改變就是永久的了。如果一旦有錯誤發生,它就不會對資料庫作任何修改或改變。
要定義一個事務,需要使用Begin tran命令,在這一命令之後的任何語句都將被認為是事務的一部分。命令Commit用來完成事務,並使事務對資料庫所作的修改成為永久的。Rollback命令用來取消一個事務,並還原事務對資料庫所作的修改。
下面是一個事務的例子:
[SQL SERVER7.0 or SQL SERVER2000] BEGIN TRAN INSERT INTO PRODUCT(PRODUCTID, PRODUCTNAME) VALUES("0001", "KEYBOARD") UPDATE PRODUCT SET PRICE=12 WHERE PRODUCTID= "0002" IF (@ERROR>0) ROLLBACK ELSE COMMIT |
什麼是異常處理。
開發一種錯誤訊息處理機制、並向使用者提供有用的、清楚、有意義的資訊也是編程人員的任務之一,異常處理就是能夠提供這一服務的一種機制。一旦事務失敗,伺服器就會向系統發出一個用於協助使用者發現並修複邦聯的資料庫錯誤資訊。我們可以異常處理功能來擷取這種異常資訊,並修複出現的故障。異常處理功能的用法如下所示:
[c#]
try { //資料庫操作命令 } catch (Exception e) { ?//如果有異常發生,這部分語句將被執行 } finally { ?//無論是否有異常發生,這部分語句都會得到執行 } |
如何?事務。
1、在一個預存程序中編寫事務語句,並使用下面的控制發現是否有錯誤發生,返回相應的值,互連網應用程式會根據返回的值顯示正確的和容易理解的錯誤資訊。下面是一個事務的例子:
[Store Procedure] CREATE PROCEDURE PRODUCT_SAVE( AS DECLARE (@USERID CHAR(5), @LOCATION VARCHAR(50), @RETURNS INT OUTPUT ) BEGIN TRAN UPDATE ADDRESS SET LOCATION=@LOCATION WHERE USERID=@USERID IF (@@ERROR>0) BEGIN @RETURNS=-1 /* Fail to Update */ ROLLBACK END ELSE @RETURNS=0 /* Succeed to update */ COMMIT
RETURN @RETURNS
[Web Application in C#] int values; DBClass dbc=new DBClass(); // 使用new命令產生一個資料庫類 values=dbc.updatedb("0001", "23 Rain Street"); //And call its function member to update record if (values==0) Lable_message.text= "Update successfully"; else Lable_message.text= "Sorry, can not update this record, please contact your DBA." |
上面的例子非常適合DBA等對資料庫編程非常熟悉的編程人員,他們更喜歡在預存程序中完成異常處理功能。如果對資料庫編程不太熟悉,則可以採取下面的方法:
2、在.NET架構中,我們可以使用SqlTransaction類定義一個事務。此後,我們就可以使用commit或rollback函數控制事務。當然了,我們也可以使用.NET架構提供的異常處理功能擷取系統異常。下面是一個有關的例子:
[Web Applicaion in C#] SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;"); myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction(); //使用New新產生一個事務 SqlCommand myCommand = new SqlCommand(); myCommand.Transaction = myTrans;
try { myCommand.CommandText = "Update Address set location=’23 rain street’ where userid=’0001’"; myCommand.ExecuteNonQuery(); myTrans.Commit(); Console.WriteLine("Record is udated."); } catch(Exception e) { myTrans.Rollback(); Console.WriteLine(e.ToString()); Console.WriteLine("Sorry, Record can not be updated."); } finally { myConnection.Close(); } |
需要注意的是,如果使用OleDb類而不是Sqlclient類來定義SQL命令和串連,我們就必須使用OleTransation來定義事務。