——此文章摘自《C#高級編程(第
版)》定價
元 特價
元 購買
事務處理
通常對數據庫要進行多次更新這些更新必須在事務處理的范圍內進行ADONET中的事務處理首先要在數據庫連接對象上調用BeginTransaction()方法這些方法返回實現IDbTransaction接口的對象而該對象是在SystemData中定義的
下面的代碼序列是在Sql Server連接上開始事務處理的
string source = server=(local)\\NetSDK; + integrated security=SSPI; +database=Northwind;
SqlConnection conn = new SqlConnection(source);
connOpen();
SqlTransaction tx = connBeginTransaction();
// Execute some commands then commit the transaction
txCommit();
connClose();
在開始一個事務處理時可以選擇在該事務處理中執行的命令獨立級別該級別確定了如何在一個數據庫會話中查看在另一個數據庫會話中所進行的修改並不是所有的數據庫引擎都支持表所示的個級別
獨 立 級 別
說 明
ReadCommitted
SQL Server默認級別這個級別可以確保只有第一個事務處理結束後在第二個事務處理中才能訪問第一個事務處理寫入的數據
ReadUncommitted
即使一個事務處理還沒有處理完數據也允許另一個事務處理從數據庫中讀取數據例如如果兩個用戶在訪問同一個數據庫第一個用戶插入一些數據但沒有完成事務處理(通過Commit或Rollback方法)第二個用戶把它們的獨立級別設置為ReadUncommitted因此可以訪問數據
RepeatableRead
這個級別擴展了ReadCommitted級別如果在事務處理中使用了相同的語句無論是否有其他潛在的數據庫更新總是可以返回相同的數據這個級別要求對數據進行額外的鎖定這會降低性能 這個級別可以保證對於初始查詢的每一行都不會修改數據但允許顯示假想(phantom)行—— 這些行是在進行事務處理時由另一個事務處理插入的全新數據行
Serializable
這是最高級的事務處理級別對數據庫中的數據進行序列化的訪問利用這種獨立級別不會顯示假想行所以在序列化的事務處理中使用的SQL語句總是檢索相同的數據序列化事務處理對性能的負面影響不應低估如果肯定不需要這個獨立級別最好不要加上它
表
SQL Server的默認獨立級別ReadCommitted是數據一致性和數據可用性的一種很好的折衷因為它比RepeatableRead 或 Serializable模式中需要的數據鎖定都少但是有時應提高獨立級別這樣在NET中才能用一種非默認的級別開始事務處理使用哪個級別沒有硬性規則全憑經驗
注意如果當前使用的是不支持事務處理的數據庫應轉而使用支持它的數據庫一旦我們成為可以完全信任的雇員且擁有錯誤數據庫的全部訪問權限就可能試鍵入id=以刪除對應的錯誤但實際上輸入的是<而不是=此時會刪除整個錯誤數據庫這可不是我們希望的幸好IS小組每天晚上都會備份該數據庫可以恢復它但使用回滾命令會更簡單
命令
在節中簡要介紹了針對數據庫執行的命令簡言之命令就是一個要在數據庫上執行的SQL文本字符串命令也可以是一個存儲過程或者返回表中所有列和所有行的表名(例如SELECT *樣式的子句)
把SQL子句作為一個參數傳遞給Command類的構造函數就可以構造一個命令如下 所示
string source = server=(local)\\NetSDK; + integrated security=SSPI; +database=Northwind;
string select = SELECT ContactNameCompanyName FROM Customers;
SqlConnection conn = new SqlConnection(source);
connOpen();
SqlCommand cmd = new SqlCommand(select conn);
<provider>Command類的屬性CommandType可以定義某個命令是一個SQL子句一個存儲過程的調用或者是一個完整的表語句(僅從給定的表中選擇所有的列和行)表總結了CommandType枚舉
命 令 類 型
樣 例
Text(默認)
String select = SELECT ContactName FROM Customers;
SqlCommand cmd = new SqlCommand(selectconn);
StoredProcedure
SqlCommandcmd=new SqlCommand(CustOrderHistconn);
cmdCommandType = CommandTypeStoredProcedure;
cmdParametersAdd(@CustomerIDQUICK);
TableDirect
OleDbCommand cmd = new OleDbCommand(Categoriesconn);
cmdCommandType = CommandTypeTableDirect;
表
在執行一個存儲過程時需要把參數傳送給過程上面的示例直接設置了參數@CustomerID但設置參數的值還可以使用其他方式詳見本章的後面
提示TableDirect命令類型只對OleDb提供程序有效—— 如果試圖把這個命令類型用於其他提供程序就會產生異常
From:http://tw.wingwit.com/Article/program/net/201311/14747.html