CARA: Melakukan transaksi didistribusikan dengan.NET penyedia dengan menggunakan ServicedComponent dalam Visual C#.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 316247 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini menunjukkan bagaimana untuk melakukan transaksi terdistribusi dengan menggunakan.NET menekankan dengan ServicedComponent kelas. Meskipun artikel ini menggunakan SqlClient.NET menekankan terhadap server Microsoft SQL Server, Anda juga dapat menggunakan ODBC atau OLE DB.NET dikelola penyedia.

Persyaratan

Daftar berikut menguraikan fitur perangkat keras, perangkat lunak, jaringan infrastruktur, dan paket layanan yang diperlukan:
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server 7.0 atau Microsoft SQL Server 2000

Sekilas pandang

Contoh-contoh.NET Framework kelas dapat berpartisipasi dalam transaksi otomatis jika Anda mempersiapkan kelas untuk melakukan hal ini. Setiap sumber daya yang kelas misalnya atau objek mengakses enlists dalam transaksi. Sebagai contoh, jika sebuah objek menggunakan ADO.NET untuk mengirim uang di account dalam database, manajer sumber daya untuk database menentukan apakah objek berjalan dalam transaksi. Jika objek harus dijalankan dalam transaksi, manajer sumber daya secara otomatis enlists database dalam transaksi.

Menggunakan proses berikut untuk mempersiapkan kelas untuk berpartisipasi dalam transaksi otomatis:
  1. Menerapkan TransactionAttribute kelas untuk kelas Anda untuk menentukan jenis transaksi otomatis yang komponen permintaan.

    Jenis transaksi harus menjadi anggota TransactionOption Pencacahan.
  2. Memperoleh kelas Anda dari ServicedComponent kelas. ServicedComponent adalah kelas dasar dari semua kelas yang menggunakan COM + layanan.
  3. Daftar Majelis dengan nama yang kuat untuk memastikan bahwa Majelis berisi sepasang kunci yang unik.
  4. Mendaftar Majelis yang berisi kelas Anda dengan COM + katalog.

    CATATAN: Jika klien bahwa panggilan contoh kelas Anda dikelola oleh common language runtime, pendaftaran dilakukan untuk Anda. Ini langkah diperlukan hanya jika pemanggil tidak dikelola menciptakan dan panggilan contoh kelas Anda. Penggunaan.Alat instalasi layanan NET (Regsvcs.exe) untuk secara manual mendaftar Majelis.
Untuk informasi lebih lanjut tentang cara sign Majelis dengan nama yang kuat, lihat topik berikut di Microsoft.NET Framework Developer panduan:
Penandatanganan Majelis dengan nama yang kuat
http://MSDN.Microsoft.com/en-us/library/xc31ft41.aspx
Untuk informasi lebih lanjut tentang proses ini, lihat topik berikut di Microsoft.NET Framework Developer panduan:
Otomatis transaksi dan.NET Framework kelas
http://MSDN.Microsoft.com/en-us/library/ms123400.aspx

Membuat proyek

  1. Ikuti langkah-langkah untuk membuat sebuah proyek aplikasi konsol baru dalam Visual C#.NET:
    1. Mulai Visual Studio.NET.
    2. Pada Berkas menu, titik Baru, lalu klik Project.
    3. Dalam Proyek baru kotak dialog, klik Visual C# proyek di bawah Jenis proyek, klik Aplikasi konsol di bawah Pola acu, lalu klik Oke.
    4. Dalam solusi Explorer, mengubah Class1.cs file sebagai DistributedTransaction.cs.
  2. Menghapus semua kode dari DistributedTransaction.cs file.
  3. Pada Project menu, klik Menambahkan referensi, dan kemudian menambahkan referensi berikut:
    • System.EnterpriseServices
    • System.data.dll

  4. Dalam AssemblyInfo.cs file, komentar baris kode berikut:
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]
    					
  5. Tambahkan kode berikut ke berkas DistributedTransaction.cs:
    using System;
    using System.Data.SqlClient;
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;
    
    [assembly: ApplicationName("DistributedTransaction")]
    [assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]
    
    
    namespace DistributedTransaction
    {
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       class Class1
       {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          [STAThread]
          static void Main(string[] args)
          {
             try
             {
                DistributedTran myDistributedTran = new DistributedTran();
                myDistributedTran.TestDistributedTransaction();
             }
             catch (System.Data.SqlClient.SqlException e)
             {
                System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);
             }         
          }
       }
       /// <summary>
       /// Summary description for TestApp.
       /// </summary>
       [Transaction(TransactionOption.Required)]
       public class DistributedTran: ServicedComponent 
       {
          public DistributedTran()
          {
          }
          [AutoComplete]
          public string TestDistributedTransaction()
          {
             // The following Insert statement goes to the first server.
             // This Insert statement does not produce any errors. 
             String insertCmdSql = "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.
             String exceptionCausingCmdSQL = "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.
             SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
             SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
    
             try
             {
                SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);
                SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);
       
                // This command runs 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();
                int cmdResult = exceptionCausingCmd.ExecuteNonQuery();
                
                SqlConn1.Close();
                SqlConn2.Close();
    
                Console.WriteLine("Hello");
                
             }
             catch (System.Data.SqlClient.SqlException ex)
             {
                // 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")
                   SqlConn1.Close();
    
                if (SqlConn2.State.ToString() == "Open")
                   SqlConn2.Close();
             }
    
             return "Success";
           
          }
    
       }
    }
    					
  6. Pada Berkas menu, klik Simpan semua.
  7. Klik Mulai, arahkan ke Program, arahkan ke Microsoft Visual Studio.NET, arahkan ke Visual Studio.Alat-alat yang bersih, lalu klik Visual Studio.Prompt Perintah NET.
  8. Buka map yang berisi proyek Anda, dan kemudian jalankan perintah berikut untuk menandatangani Majelis dengan nama yang kuat:
    SN -k DistributedTransaction.snk
  9. Membangun aplikasi Anda.
  10. Membuat tabel berikut di server SQL Server pertama:
    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 
    					
  11. Menjalankan aplikasi Anda. Perhatikan bahwa Anda menerima pesan galat berikut (yang adalah perilaku yang diharapkan):
    Transaksi Aborted: Kesalahan kembali: nama objek tidak valid 'NonExistentTable'.
  12. Buka SQL Server Query Analyzer, tambahkan kode berikut, dan kemudian tekan F5 untuk menjalankan query:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    Perhatikan bahwa permintaan tidak kembali setiap baris karena transaksi dibatalkan.
  13. Cari kode berikut dalam Visual C# proyek Anda:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    						
    dan mengganti pernyataan SQL dengan permintaan yang sah yang tidak menyebabkan transaksi untuk membatalkan. Misalnya:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
    					
  14. Tekan F5 untuk mengkompilasi dan menjalankan aplikasi lagi.
  15. Jalankan perintah dari langkah 12 dalam Query Analyzer lagi. Perhatikan bahwa permintaan kembali baris karena transaksi mampu menyelesaikan berhasil.
CATATAN:
  • Contoh ini tidak melakukan kesalahan penanganan.
  • SQL Server dan koordinator transaksi Microsoft didistribusikan (MS DTC) harus berjalan pada semua klien dan server.

REFERENSI

Untuk informasi tambahan, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
306296 CARA: Membuat layanan.NET komponen yang menggunakan transaksi di Visual C#.NET

Properti

ID Artikel: 316247 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Kata kunci: 
kbcompiler kbhowtomaster kbsqlclient kbsystemdata kbmt KB316247 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:316247

Berikan Masukan

 

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