本文將逐步告訴您,如何使用 COM + Visual C# 類別中的 (元件服務) 交易。一組的資料庫作業會被視為一個單位。可能是所有作業均都成功或者,如果一項作業失敗,整筆交易也會失敗。在後者的情況下而嘗試進行任何資料庫作業是不會張貼到基礎資料庫。
需求
下列項目描述建議的硬體、 軟體、 網路基礎結構、 技能和知識及您必須擁有 Service Pack:
- Microsoft Windows 2000 Server SP1
- Microsoft 網際網路資訊服務 (IIS) 4.0 (含) 以後版本
- Microsoft Internet Explorer 版本 5.0、 5.5 或 6.0 版
本文假設您已熟悉下列:
COM + 交易服務
您可以實作交易處理與 Microsoft.NET Framework 中
System.EnterpriseServices 命名空間。要存取 COM + 交易服務會建立類別。要這麼做,請您執行下列步驟:
- 啟動 Visual Studio.NET 或 Visual Studio 2005。
- 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
- 在 [專案類型 下, 按一下 [Visual C# 專案,然後按一下 [範本] 下方的 [類別庫。命名專案 prjEnterprise。
附註在 Visual 的 Studio 2005 中按一下 Visual C#專案類型,] 下,然後再按一下 [範本] 下方的 [類別庫。命名專案 prjEnterprise。 - 依照預設值,會建立類別 1。
- 在 [方案總管] 中以滑鼠右鍵按一下 [參考],然後按一下 [加入參考]。
- 出現 [加入參考] 對話方塊。 在 [.NET] 索引標籤上的 元件名稱,] 下連按兩下 System.EnterpriseServices。
- 請確定 System.EnterpriseServices 出現在 [選取的元件。按一下 [確定]。
- 將下列的程式碼之前加入 Class1.cs 檔案中的任何其他陳述式:
using System.EnterpriseServices;
using System.Data.SqlClient;
- 加入名為 clsES Class1.cs 檔案的新類別。
- 若要將 COM + 交易式服務您的類別 (clsES) 必須繼承功能從 ServicedComponent,如下所示:
public class clsES : ServicedComponent
- 交易 屬性用來指定的類別的交易支援層級,如下所示:
[Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
- clsES] 類別中建立方法,並命名 dbAccess 所收到四個輸入的整數參數。前兩個參數會提供一個的產品 ID 和單位於該產品的順序。其次兩個參數會提供該產品的產品 ID 和庫存單位。這個方法會執行一組的資料庫作業對要被視為交易這些指定的產品識別碼:
void dbAccess(int pID1,int onOrder, int pID2, int inStock)
- dbAccess] 方法中建立 SQL 連線物件的 [北風資料庫,然後再開啟連線。資料庫作業發生藉由使用下列資料庫:
附註請記得將變更下列連接字串參數,以反映您的 SQL Server 伺服器正確的值。
SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
Conn.Open();
- 設定要擷取資料庫處理期間,可能會發生任何例外狀況的 try 區塊。您必須攔截這些例外狀況來中止交易。try 區塊包括兩個資料庫作業。每個作業更新不同欄位中 一個指定的產品資料表記錄。
- 執行到產品表格第一次更新。更新產品識別碼為前, 兩個輸入參數中所指定的 onOrder 值 UnitsonOrder 欄位。使用下列 SQL 命令執行這個 SQL 更新:
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
sqlCommand.ExecuteNonQuery(); - 執行另一個更新與產品] 資料表。更新 UnitsinStock 欄位與 inStock 產品識別碼為,第三個和第四個輸入參數中所指定的值。使用下列 SQL 命令執行這個 SQL 更新:
sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
sqlCommand.ExecuteNonQuery();
- 由於這些更新是 COM + 交易的一部份,他們要認可視為一個單位。contextUtil 類別 System.EnterpriseServices 命名空間中的 setComplete 方法用來認可交易 (在這種情況下,兩個更新) 如果沒有錯誤已擲回:
ContextUtil.SetComplete();
- 到北風資料庫連線已關閉:
- 您必須攔截,以便中止整筆交易在執行 SQL 命令發生任何例外狀況:
- contextUtil 類別 System.EnterpriseServices 命名空間中的 setAbort 方法來中止整個交易。如果第一次更新成功,且第二個更新失敗,既非更新會張貼到 [產品] 表格。呼叫端指出交易失敗就會擲回已攔截的例外狀況:
ContextUtil.SetAbort();
throw e;
}
- 為了正確執行這個元件,元件必須有強式名稱。產生強式名稱,然後簽署組件具有強式名稱。要這麼做,請您執行下列步驟:
- 在 [Visual Studio.NET 命令提示字元下鍵入 [sn.exe-k snEnterprise.snk 建立金鑰檔]。如需使用強式名稱簽署組件的詳細資訊,請參閱.NET Framework SDK 文件。
- 將 snEnterprise.snk 複製到您的專案資料夾。
- 在 AssemblyInfo.vc,新增下行程式碼之前或在其他組件屬性陳述式之後:
[assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")] - 儲存,然後再建置您的專案。
完成程式碼清單
附註 Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;
namespace prjEnterprise
{
[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
{
public SqlConnection Conn;
public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
{
try
{
SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
Conn.Open();
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
sqlCommand.ExecuteNonQuery();
sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
sqlCommand.ExecuteNonQuery();
ContextUtil.SetComplete();
Conn.Close();
}
catch(Exception e)
{
ContextUtil.SetAbort();
throw e;
}
finally
{
}
}
}
}請確認它可以運作
若要測試此程式碼,建立主控台應用程式使用 clsES 專案。交易成功一種情況和
onorder 和
instock 都會更新指定的產品的欄位。在第二種情況下更新指定的產品之
onOrder 欄位成功,但的更新
inStock 欄位的產品會失敗,因為指定的產品編號不存在 [產品] 資料表中。這會導致交易失敗,且在交易會被忽略。
- 在 Visual Studio.NET] 或 [Visual Studio 2005 中指向 [檔案] 功能表上的 [新增],然後按一下 [專案]。
- 在 [專案類型 下, 按一下 [Visual C# 專案,然後按一下 [範本] 下方的 [主控台應用程式。
附註在 Visual 的 Studio 2005 中按一下 Visual C#專案類型,] 下,然後再按一下 [範本] 下方的 [主控台應用程式。 - 在 [名稱] 文字方塊中,輸入 testES。請確定已選取 [新增至方案] 選項。
- 按一下 [確定]],將這個專案加入至方案。
- 如要測試 clsEStestES,您必須將參考加入。在 [方案總管] 中以滑鼠右鍵按一下 testES (您剛新增) 的在 [參考],然後按一下 [加入參考]。
- 出現 [加入參考] 對話方塊。在 [專案] 索引標籤中,按兩下 prjEnterprise。
- 參考出現在下方 選定元件。按一下 [確定]],將加入這個專案的參考。
- 將參考加入至專案 System.EnterpriseServices 文件庫。在 [方案總管] 中以滑鼠右鍵按一下 [參考],然後按一下 [加入參考]。
- 出現 [加入參考] 對話方塊。 在 [.NET] 索引標籤上的 元件名稱,] 下連按兩下 System.EnterpriseServices。
- 請確定 System.EnterpriseServices 出現在 [選取的元件。按一下 [確定]。
- 主控台應用程式上按一下滑鼠右鍵 (testES) 然後按一下 [設定為啟始專案
- 下列的來源程式碼貼 Main 函式的 類別 1 類別中:
prjEnterprise.clsES myTest = new prjEnterprise.clsES();
try
{
myTest.dbAccess(1, 777, 2, 888);
Console.WriteLine("TRANSACTION ONE -- SUCCESS");
myTest.dbAccess(1, 5, 2, -20);
Console.WriteLine("TRANSACTION TWO -- SUCCESS");
}
catch (Exception e)
{
Console.WriteLine("TRANSACTION FAILURE");
} - 按下 F5 以執行測試程式碼。
在步驟 7 中程式碼,dbAccess 第一次呼叫會成功。產品 1 和產品 2 是在 [產品] 資料表中。產品 1 onOrder 欄位會更新以 777,以及 inStock 欄位到 888 更新產品 2。因為此交易成功,您會收到下列訊息在 [輸出] 視窗中 交易一位成功
dbAccess 到第二個呼叫會失敗。因此,dbAccess 至產品資料表中的都不更新陳述式會回傳到資料庫。雖然產品 1 可能有其 onOrder] 欄位更新為 5,不能有產品 2 其 inStock 欄位設定為 -20。因為在 [產品] 資料表定義中定義的條件約束的 inStock 不允許有負數。
因此,dbAccess 這個呼叫會失敗,且整筆交易失敗。[產品] 表格會保持對 dbAccess 呼叫前。catch 陳述式會處理從 dbAccess,交易失敗的通知,並且您在 [輸出] 視窗中收到下列錯誤訊息: - 使用 SQL Server 企業管理員檢查北風產品] 資料表的內容。當您檢視產品 1 時,onOrder 欄位等於 777。當您檢視產品 2 instock 欄位是 888。因此,dbAccess (這會造成這些欄位不同的值) 至第二個呼叫會失敗。
疑難排解
- 請確定使用 COM + 服務的專案具有強式名稱。
- 使用 COM + 服務的任何類別必須繼承自服務元件。服務的元件位於 System.EnterpriseServices 命名空間中。
- 偵錯,時可能會在逾時間交易認可或中止之前。若要避免逾時,使用 [交易屬性上的 [逾時內容]。在下列範例相關聯的方法具有 1,200 秒鐘才能完成任何交易,才算逾時:
[Transaction(TransactionOption.Required,timeout=1200)]
如需詳細資訊請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:
文章編號: 816141 - 上次校閱: 2007年11月22日 - 版次: 4.3
這篇文章中的資訊適用於:
- Microsoft Visual C# 2005 Express Edition
- Microsoft Visual C# .NET 2003 標準版
- Microsoft Visual C# .NET 2002 Standard Edition
| kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 KbMtzh |
機器翻譯重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:
816141
(http://support.microsoft.com/kb/816141/en-us/
)
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。