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

文章翻譯 文章翻譯
文章編號: 316627 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

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

需求

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

概觀

如果您準備要執行這項操作類別,.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 開發人員手冊 》 中下列的主題:
使用強式名稱組件簽署
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
如需有關此程序的詳細資訊,請參閱下列主題在.NET Framework 開發人員快速入門] 中的]:
自動交易和.NET Framework 類別
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

建立專案

  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 System
    Imports System.Data.SqlClient
    Imports System.EnterpriseServices
    Imports System.Runtime.CompilerServices
    Imports 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 Class
    End 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]
    GO
    
    CREATE 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)。

?考

如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
312902如何: 在 Visual Basic.NET 中建立服務的.NET 元件

屬性

文章編號: 316627 - 上次校閱: 2014年2月24日 - 版次: 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
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:316627
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