使用SQL
Transaction類和
NET提供的異常處理機制
我們就能夠以一種可靠的方式處理數據庫運行中的問題和發現系統異常
這篇小文章將解釋事務處理和異常處理的概念和用法
什麼是事務?
事務處理是由以一個單一的邏輯單位完成的一系列操作
它可以由一系列的SQL語句
SELECT
INSERT
UPDATE
DELETE組成
如果在該單位包含的操作執行完畢後沒有發生錯誤
那麼它對數據庫所作的改變就是永久的了
如果一旦有錯誤發生
它就不會對數據庫作任何修改或改變
要定義一個事務
需要使用Begin tran命令
在這一命令之後的任何語句都將被認為是事務的一部分
命令Commit用來完成事務
並使事務對數據庫所作的修改成為永久的
Rollback命令用來取消一個事務
並還原事務對數據庫所作的修改
下面是一個事務的例子
[SQL SERVER
or SQL SERVER
]
BEGIN TRAN
INSERT INTO PRODUCT(PRODUCTID
PRODUCTNAME) VALUES(
KEYBOARD
)
UPDATE PRODUCT SET PRICE=
WHERE PRODUCTID=
IF (@ERROR>
)
ROLLBACK
ELSE
COMMIT
什麼是異常處理?
開發一種錯誤消息處理機制
並向用戶提供有用的
清楚
有意義的信息也是編程人員的任務之一
異常處理就是能夠提供這一服務的一種機制
一旦事務失敗
服務器就會向系統發出一個用於幫助用戶發現並修復邦聯的數據庫錯誤信息
我們可以異常處理功能來獲取這種異常信息
並修復出現的故障
異常處理功能的用法如下所示
[c#]
try
{
//數據庫操作命令
}
catch (Exception e)
{
?//如果有異常發生
這部分語句將被執行
}
finally
{
?//無論是否有異常發生
這部分語句都會得到執行
}
如何實現事務?
在一個存儲過程中編寫事務語句
並使用下面的控制發現是否有錯誤發生
返回相應的值
互聯網應用程序會根據返回的值顯示正確的和容易理解的錯誤信息
下面是一個事務的例子
[Store Procedure]
CREATE PROCEDURE PRODUCT_SAVE( AS
DECLARE
(@USERID CHAR(
)
@LOCATION VARCHAR(
)
@RETURNS INT OUTPUT
)
BEGIN TRAN
UPDATE ADDRESS SET LOCATION=@LOCATION WHERE USERID=@USERID
IF (@@ERROR>
)
BEGIN
@RETURNS=
/* Fail to Update */
ROLLBACK
END
ELSE
@RETURNS=
/* Succeed to update */
COMMIT
RETURN @RETURNS
[Web Application in C#]
int values;
DBClass dbc=new DBClass(); // 使用new命令生成一個數據庫類
values=dbc
updatedb(
Rain Street
); //And call its function member to update record
if (values==
)
Lable_message
text=
Update successfully
;
else
Lable_message
text=
Sorry
can not update this record
please contact your DBA
上面的例子非常適合DBA等對數據庫編程非常熟悉的編程人員
他們更喜歡在存儲過程中完成異常處理功能
如果對數據庫編程不太熟悉
則可以采取下面的方法
在
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=
rain street
where userid=
;
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來定義事務
From:http://tw.wingwit.com/Article/program/net/201311/12860.html