如何使用 Visual Basic.NET 元件中的 COM + 交易

文章翻譯 文章翻譯
文章編號: 315707 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步示範如何使用 COM + (元件服務) 在 Visual Basic.NET 類別中的交易。一組的資料庫作業被視為一個單位。作業是所有成功或,如果一項作業失敗,整個交易也會失敗。在後者的情況下已嘗試任何資料庫作業是不會張貼到基礎資料庫。

需求

下列項目描述建議的硬體、 軟體、 網路基礎結構、 技能和知識及 Service Pack:
  • Microsoft Windows 2000 伺服器執行 SP-1
  • Microsoft 網際網路資訊服務 (IIS) 4.0 (含) 以後版本
  • Microsoft Internet Explorer 5.0、 5.5 或 6.0 版
先前所需的知識:
  • 交易式的概念和處理的知識
  • 熟悉使用 COM + (元件服務)

COM + 交易服務

System.EnterpriseServices 命名空間內 Microsoft.NET Framework 提供實作交易處理功能。若要取得存取 COM + 交易服務會建立類別,請依照下列步驟執行:
  1. 開啟 Visual Studio.NET。
  2. 建立名為 prjEnterprise Visual Basic.NET 中的新類別庫專案。Visual Basic.NET 會建立名為類別 1 的公用類別。
  3. 將參考加入至專案 System.EnterpriseServices 文件庫。方案總管] 視窗中以滑鼠右鍵按一下 [參考] 資料夾,然後再選取快顯功能表中的 [加入參考]。在 [.NET] 索引標籤上捲動直到您找出 System.EnterpriseServices。連按兩下 System.EnterpriseServices、 確定 System.EnterpriseServices 出現在選取的元件] 視窗,然後再按 [確定]
  4. 使用 Imports 陳述式,做 System.EntpriseServices 命名空間和 System.Data.SqlClient] 命名空間,因此您不需要完整限定這些命名空間在稍後的程式碼中的任何參考。之前在類別檔案中的任何其他陳述式,必須出現這些陳述式:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. 若要使用 COM + 交易式服務,名為 clsES,您類別必須從 ServicedComponent 繼承功能:
    	Public Class clsES
    Inherits ServicedComponent
  6. 交易 屬性用來指定的類別的交易支援層級:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. 建立內 clsES 稱為 dbAccess 接收四個輸入的整數參數的方法。前兩個參數會提供產品識別碼] 及 [單位於該產品的順序。第二個兩個參數會提供該產品產品識別碼及庫存單位。這個方法會執行一組的資料庫作業對要被視為交易這些指定的產品識別碼:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. dbAccess] 方法中建立 SQL 連線物件的 [北風資料庫,然後再開啟連線。使用此資料庫來進行資料庫作業:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. 設定要擷取任何可能發生的資料庫處理的 Try 區塊。這些錯誤必須攔截,才能中止交易。Try 區塊會包含兩個的資料庫作業更新不同的欄位,在指定的產品資料表的資料錄中每個
    		Try
  10. 執行到產品表格第一次更新。更新的產品識別碼為前, 兩個輸入參數中所指定的 onOrder 值 UnitsonOrder 欄位。一個 SQLcommand 用來執行此更新 SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. 執行另一個更新與產品] 資料表。更新的產品識別碼為,第三個和第四個輸入參數中所指定的 inStock 值 UnitsinStock 欄位。一個 SQLCommand 用來執行此更新 SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. 由於這些更新是 COM + 交易的一部份,他們要認可視為一個單位。如果沒有錯誤已擲回,使用 contextUtil 類別從 System.EnterpriseServices 命名空間的 setComplete 方法來認可交易--在這種情況下兩次更新--:
          ContextUtil.SetComplete()
  13. 到北風資料庫連線已關閉:
          Conn.Close()
  14. 任何錯誤發生時執行 SQL 命令必須被攔截,以便在中止整個交易:
    	   Catch e As Exception
  15. contextUtil 類別 System.EnterpriseServices 命名空間中的 setAbort 方法來中止整個交易。如果第一次更新成功,且第二個更新失敗,既非更新會張貼到 [產品] 表格。呼叫端指出交易失敗就會擲回已攔截的例外狀況:
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. 此元件以正確運作,元件必須有強式名稱。請依照下列步驟執行產生強式名稱,並具有強式名稱組件簽署:

    1. 若要開啟 Visual Studio.NET 命令提示字元、 按一下 [開始]、 按一下 [程式]、 按一下 Microsoft Visual Studio.NET,然後按一下 [Visual Studio.NET 工具
    2. 在的命令提示字元輸入 [sn.exe-k snEnterprise.snk ?為您的組件指定強式名稱]。

      如需使用強式名稱簽署組件的詳細資訊,請參閱.NET Framework SDK 文件。
    3. 將 snEnterprise.snk 複製到專案資料夾中。
    4. 在 AssemblyInfo.vb,新增下行程式碼之前或在其他組件屬性陳述式之後:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. 儲存並建置專案。

完整的程式碼清單

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

請確認它可以運作

若要測試此程式碼,建立主控台應用程式使用 clsES。 交易成功一種情況和 onorderinstock 都會更新指定的產品的欄位。在第二種情況下更新指定的產品之 onOrder 欄位成功,但的更新 inStock 因為 [產品] 資料表中不存在指定的產品編號] 欄位的產品失敗。這會導致交易失敗與交易被忽略。
  1. 新增新的主控台應用程式,名為 testES 至您的方案,讓方案中包含 testES 專案和 prjEnterprise 專案。加入新的專案、 按一下 [檔案] 功能表上的 [新增],然後選取 [專案]。
  2. 出現 [新增專案] 對話方塊。選取 [Visual Basic] 資料夾在 [專案類型] 窗格] 和 [從範本然後選取 主控台應用程式。在 [範本] 窗格下的 [名稱] 方塊鍵入 testES,這是專案的名稱。確定已選取 [新增至方案] 按鈕,會出現在對話方塊底部。按一下 [確定]],將這個專案加入至方案。
  3. 若要測試 clsES testES 以便您必須加入一個參考。在 [方案] 視窗中以滑鼠右鍵按一下低於專案 testES,您剛剛新增的 [參考] 資料夾。 選取 [加入參考]。加入參考] 對話方塊隨即出現。
  4. 選取 [專案] 索引標籤,然後連按兩下 prjEnterprise。參考應該會出現在 選取的元件,也就是在對話方塊下方。按一下 [若要加入此參考此專案的 [確定]
  5. 主控台應用程式 testES 上, 按一下滑鼠右鍵,然後再選取 設定為啟始專案
  6. 偵錯] 功能表上選取 [Windows]。在子功能表上選取 [即時運算]。這確保即時運算視窗是可見。
  7. 將下列程式測試碼複製到單元 Module1 取代 Sub Main 和 End Sub 陳述式。模組應該出現,如下所示:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. 按下 F5 以執行測試程式碼。
  9. 在步驟 7 中程式碼,dbAccess 第一次呼叫會成功。 產品 1 和產品 2 是在 [產品] 資料表中。產品 1 onOrder 欄位會更新以 777,以及 inStock 欄位到 888 更新產品 2。因為此交易成功,[即時運算] 視窗應該顯示訊息 「 交易 1-成功 」。

    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) 網站:
COM + 整合: 如何.NET 企業服務可以幫助您建置分散式應用程式
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

服務的元件
http://msdn.microsoft.com/en-us/library/aa289839.aspx

屬性

文章編號: 315707 - 上次校閱: 2005年11月8日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbmt kbhowtomaster KB315707 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:315707
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com