如何: 使用 ServicedComponent Visual Basic.NET 中執行.NET 提供廠商的分散式的交易

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

316627
本文已封存。本文係以「現狀」提供且不會再更新。
本文章的有 Microsoft Visual C#.NET] 版本請參閱 316247

本文參照下列 Microsoft.NET Framework 類別庫命名空間:
  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

在此工作

結論
本文將逐步告訴您,如何藉由使用.NET 提供者具有 ServicedComponent 類別執行分散式的交易。雖然本文使用 SqlClient.NET 提供者對 Microsoft SQL Server 伺服器,也可以使用 ODBC 或 OLE DB.NET Managed 提供者。

back to the top

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及所需的 Service Pack:
  • Microsoft Windows 2000 專業版,Windows 2000 Server Windows 2000 進階的伺服器
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 或 SQL Server 2000
back to the top

概觀

如果您準備要執行這項操作類別,.NET Framework 類別的執行個體可以參與自動交易。每個類別執行個體或物件存取的資源登記在交易中。比方說如果物件會使用 ADO.NET 來在資料庫中的帳戶張貼金錢,資料庫的資源管理員會決定物件是否會在交易中執行。如果物件應該在交易中執行,資源管理員會自動登記在交易中的資料庫。

使用下列程序來準備類別以參與自動交易:
  1. TransactionAttribute 類別套用到您的類別,以指定元件要求自動交易類型。

    交易類型必須是 TransactionOption 列舉型別的成員。例如:
    <Transaction(TransactionOption.Required)> Public Class Bar   Inherits ServicedComponent   '. . .End Class					
  2. ServicedComponent 類別衍生您的類別。ServicedComponent 是使用 COM + 服務的所有類別的基底類別。
  3. 簽署使用強式名稱組件,請確定組件包含唯一的金鑰組。
  4. 註冊組件,其中包含您的類別與 COM + 目錄。

    注意: 如果用戶端會呼叫您類別的執行個體由通用語言執行階段管理,為您執行註冊。這個步驟是必要的只有不受管理的呼叫端會建立,且會呼叫您類別的執行個體。使用 「.NET 服務安裝工具 (Regsvcs.exe) 手動註冊組件 」。
更多有關如何簽署使用強式名稱組件請參閱 Microsoft.NET Framework 開發人員手冊 》 中下列的主題: 如需有關此程序的詳細資訊,請參閱下列主題在.NET Framework 開發人員快速入門] 中的]: back to the top

建立專案

  1. 請依照下列步驟執行在 Visual Basic.NET 中建立新的主控台應用程式專案:
    1. 啟動 Visual Studio.NET。
    2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
    3. 在 [新增專案] 對話方塊按一下 [專案類型] 下的 [Visual Basic 專案]、 範本,] 下方按一下 [主控台應用程式,然後按一下 [確定]]。
    4. 在 [方案總管] 中重新命名為 DistributedTransaction.vb 的 Module1.vb 檔案。
  2. 刪除 DistributedTransaction.vb 檔案中的所有程式碼。
  3. 在 [專案] 功能表上按一下 [加入參考],並再將下列參考:
    • System.EnterpriseServices
    • System.Data.dll

  4. 將下列程式碼加入至 DistributedTransaction.vb 檔:
    Imports SystemImports System.Data.SqlClientImports System.EnterpriseServicesImports System.Runtime.CompilerServicesImports System.Reflection<Assembly: ApplicationName("DistributedTransaction")> <Assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")> Namespace DistributedTransaction    '<summary>    'Summary description for Class1.    '</summary>    Module Module1        '<summary>        'The main entry point for the application.        '</summary>        <STAThread()> Sub Main()            Try                Dim myDistributedTran As New DistributedTran()                myDistributedTran.TestDistributedTransaction()            Catch e As System.Data.SqlClient.SqlException                System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message)            End Try        End Sub    End Module    '<summary>    'Summary description for TestApp.    '</summary>    <Transaction(TransactionOption.Required)> Public Class DistributedTran        Inherits ServicedComponent        Public Sub DistributedTran()        End Sub        <AutoComplete()> Public Function TestDistributedTransaction() As String            'The following Insert statement goes to the first server.            'This Insert statement does not produce any errors.             Dim insertCmdSql As String = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')"            'The following Delete statement goes to the second server.            'Because the table does not exist, this code throws an exception.             Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"            'The following connection strings create instances of two SqlConnection objects            'to connect to two different SQL Server servers in your environment.            'Modify the connection strings as necessary for your environment.            Dim SqlConn1 As New SqlConnection("Server=Name_of_Server1;uid=User_Id;database=DatabaseName;pwd=Password")            Dim SqlConn2 As New SqlConnection("Server=Name_of_Server2;uid=User_Id;database=DatabaseName;pwd=Password")            Try                Dim insertCmd As New SqlCommand(insertCmdSql, SqlConn1)                Dim exceptionCausingCmd As New SqlCommand(exceptionCausingCmdSQL, SqlConn2)                'This command should run properly.                insertCmd.Connection.Open()                insertCmd.ExecuteNonQuery()                'This command results in an exception, which automatically rolls back                'the first command (the insertCmd command).                exceptionCausingCmd.Connection.Open()                Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()                SqlConn1.Close()                SqlConn2.Close()                Console.WriteLine("Hello")            Catch ex As System.Data.SqlClient.SqlException                'After you catch the exception in this function, throw it.                'The service component receives this exception and aborts the                'transaction. The service component then throws the same exception,                'and the calling function receives the error message.                Console.WriteLine(ex.Message)                Throw (ex)            Finally                'Close the connection.                If SqlConn1.State.ToString() = "Open" Then                    SqlConn1.Close()                End If                If SqlConn2.State.ToString() = "Open" Then                    SqlConn2.Close()                End If            End Try            Return "Success"        End Function    End ClassEnd Namespace 					
  5. 在 [檔案] 功能表上按一下 [全部儲存]。
  6. 按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio.NET]、 指向 Visual Studio.NET 工具,然後再按一下 [Visual Studio.NET 命令提示字元]。
  7. 開啟您的專案所在的資料夾,然後再執行下列命令以使用強式名稱組件簽署:
    sn k DistributedTransaction.snk
  8. 建置您的應用程式。
  9. 在第一個 SQL Server 伺服器中建立下列表格:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[TestTransaction]GOCREATE TABLE [dbo].[TestTransaction] (	[Col1] [int] NULL ,	[Col2] [varchar] (100) NULL ) ON [PRIMARY]GO 					
  10. 執行您的應用程式。請注意您會收到下列錯誤訊息 (這是預期的行為):
    交易已中止: 傳回錯誤: 無效的物件名稱 'NonExistentTable'。
  11. 開啟 SQL Server 查詢分析、 加入下列程式碼,然後按 F5 以執行查詢:
    USE NORTHWIND;SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'						
    注意交易已中止,因為查詢不傳回任何資料列。
  12. 在 Visual Basic 專案中找出下列程式碼:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"						
    並使用有效的查詢並不會使交易中止取代 SQL 陳述式。例如:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"					
  13. 請按 F5 編譯並執行應用程式一次。
  14. 再次從步驟 11 在 Query Analyzer 中執行命令。請注意交易能夠順利完成,所以查詢會傳回資料列。
注意
  • 本範例並不會執行錯誤處理。
  • 所有用戶端和伺服器上必須執行 SQL Server,而且 Microsoft 分散式交易協調器 (MS DTC)。
back to the top
参考
如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
312902如何: 在 Visual Basic.NET 中建立服務的.NET 元件
back to the top

警告:本文已自動翻譯

內容

文章識別碼:316627 - 最後檢閱時間:02/24/2014 03:32:45 - 修訂: 2.1

  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft .NET Framework Service Pack 2
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtzh
意見反應