วิธีการ: ทำธุรกรรมแบบกระจายด้วยการผู้ให้บริการสุทธิ โดยใช้ ServicedComponent ใน Visual C#สุทธิ

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 316247 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

บทความทีละขั้นตอนนี้อธิบายเกี่ยวกับวิธีการทำธุรกรรมที่แจกจ่าย โดยใช้การผู้ให้บริการ NET กับServicedComponentคลาสที่ แม้ว่าบทความนี้ใช้ SqlClientผู้ให้บริการ NET กับเซิร์ฟเวอร์ Microsoft SQL Server คุณสามารถใช้ ODBC หรือ OLE DB นั้นที่ผู้ให้บริการได้รับการจัดการสุทธิ

ความต้องการ

ให้คำอธิบายรายการต่อไปนี้เกี่ยวกับฮาร์ดแวร์ที่แนะนำ ซอฟท์แวร์ ระบบเครือข่าย และเซอร์วิสแพ็คที่จำเป็นต้องใช้:
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows 2000 Server ขั้นสูง
  • Microsoft Visual Studioสุทธิ
  • Microsoft SQL Server 7.0 หรือ Microsoft SQL Server 2000

ภาพรวม

อินสแตนซ์ของตัวNET Framework คลาสสามารถมีส่วนร่วมในธุรกรรมอัตโนมัติถ้าคุณเตรียมชั้นนี้ ทรัพยากรแต่ละอินสแตนซ์ของคลาสหรือวัตถุมีการเข้าถึง enlists ในธุรกรรม ตัวอย่างเช่น การถ้าวัตถุใช้ ADOสุทธิการลงรายการบัญชีจำนวนเงินในบัญชีผู้ใช้ในฐานข้อมูล ตัวจัดการทรัพยากรของฐานข้อมูลเป็นตัวกำหนดว่า วัตถุเรียกใช้ในธุรกรรม ถ้าวัตถุควรเรียกใช้ในธุรกรรม ตัวจัดการทรัพยากร enlists ฐานข้อมูลในธุรกรรมโดยอัตโนมัติ

ใช้ขั้นตอนต่อไปนี้เพื่อเตรียมคลาสที่จะเข้าร่วมในธุรกรรมอัตโนมัติ:
  1. นำไปใช้ในTransactionAttributeคลาสที่เป็นคลาสของคุณเพื่อระบุชนิดของธุรกรรมอัตโนมัติที่คอมโพเนนต์ร้องขอ

    ชนิดของธุรกรรมต้องเป็นสมาชิกของTransactionOptionการแจงนับ
  2. ระดับชั้นของคุณจากการสืบทอดมาServicedComponentคลาสที่ServicedComponentมีคลาสพื้นฐานของประเภทสินค้าทั้งหมดที่ใช้ COM + services
  3. เข้าสู่ระบบที่ประกอบ ด้วยชื่อที่รัดกุมเพื่อให้แน่ใจว่า แอสเซมบลีที่ประกอบด้วยคู่คีย์ที่ไม่ซ้ำกัน
  4. ลงทะเบียนแอสเซมบลีที่ประกอบด้วยชั้นของคุณ ด้วยแค็ตตาล็อก COM +

    หมายเหตุ: ไคลเอ็นต์ที่เรียกใช้อินสแตนซ์ของคลาสของคุณถูกจัดการ โดยการใช้งานจริงภาษาทั่วไป การลงทะเบียนจะเกิดขึ้นถ้าคุณ ขั้นตอนจำเป็นเฉพาะเมื่อมีผู้เรียกไม่มีการจัดการสร้าง และเรียกใช้อินสแตนซ์ของคลาสของคุณ ใช้การNET บริการติดตั้งมือ (Regsvcs.exe) ลงทะเบียนแอสเซมบลีด้วยตนเอง
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการลงชื่อเข้าใช้แอสเซมบลีที่ มีชื่อที่คาดเดายาก ดูหัวข้อต่อไปนี้ใน Microsoftคำแนะนำของผู้พัฒนา NET Framework:
การเซ็นชื่อแอสเซมบลีที่ มีชื่อที่คาดเดายาก
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการนี้ ดูหัวข้อต่อไปนี้ใน Microsoftคำแนะนำของผู้พัฒนา NET Framework:
ธุรกรรมอัตโนมัติ และNET Framework Classes
http://msdn.microsoft.com/en-us/library/ms123400.aspx

สร้างโครงการ

  1. ทำตามขั้นตอนเหล่านี้เพื่อสร้างโครงการของแอพลิเคชันของคอนโซลใหม่ใน Visual C#NET:
    1. เริ่มการทำงานของ Visual Studioสุทธิ
    2. บนเครื่องแฟ้มเมนู การชี้ไปที่ใหม่แล้ว คลิกโครงการ.
    3. ในการโครงการใหม่กล่องโต้ตอบ คลิกVisual C# โครงการภายใต้ชนิดโครงการคลิกแอพลิเคชันของคอนโซลภายใต้แม่แบบแล้ว คลิกตกลง.
    4. ในการแก้ไขปัญหา Explorer เปลี่ยนชื่อไฟล์ Class1.cs เป็น DistributedTransaction.cs
  2. ลบรหัสทั้งหมดจากแฟ้ม DistributedTransaction.cs
  3. บนเครื่องโครงการเมนู คลิกเพิ่มการอ้างอิงแล้ว เพิ่มการอ้างอิงดังต่อไปนี้:
    • System.EnterpriseServices
    • System.Data.dll

  4. ในแฟ้ม AssemblyInfo.cs ข้อคิดเห็นบรรทัดโค้ดต่อไปนี้:
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]
    					
  5. เพิ่มรหัสต่อไปนี้ในไฟล์ 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. บนเครื่องแฟ้มเมนู คลิกบันทึกทั้งหมด.
  7. คลิกเริ่มการทำงานชี้ไปที่โปรแกรมชี้ไปที่Microsoft Visual Studioสุทธิชี้ไปที่Visual Studioเครื่องมือสุทธิแล้ว คลิกVisual Studioหน้าจอพร้อมรับคำสั่ง NET.
  8. เปิดโฟลเดอร์ที่ประกอบด้วยโครงการของคุณ แล้ว เรียกใช้คำสั่งต่อไปนี้เพื่อเข้าสู่ระบบที่ประกอบ ด้วยชื่อที่คาดเดายาก:
    sn -k DistributedTransaction.snk
  9. สร้างแอพลิเคชันของคุณ
  10. สร้างตารางต่อไปนี้ในเซิร์ฟเวอร์ 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 
    					
  11. เรียกใช้โปรแกรมประยุกต์ของคุณ ขอให้สังเกตว่า คุณได้รับข้อผิดพลาดต่อไปนี้ (ซึ่งเป็นลักษณะการทำงานที่คาดไว้):
    ถูกยกเลิกธุรกรรม: การส่งคืนข้อผิดพลาด: ชื่อของวัตถุที่ไม่ถูกต้อง 'NonExistentTable'
  12. เปิดตัววิเคราะห์คำถาม SQL Server เพิ่มโค้ดต่อไปนี้ แล้ว กด F5 เพื่อเรียกใช้แบบสอบถาม:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    โปรดสังเกตว่า แบบสอบถามไม่กลับแถวใด ๆ เนื่องจากธุรกรรมถูกยกเลิก
  13. ค้นหาโค้ดต่อไปนี้ในโครงการ Visual C#:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    						
    และแทนคำสั่ง SQL ด้วยแบบสอบถามที่ถูกต้องที่ทำให้เกิดธุรกรรมการยกเลิก ตัวอย่างเช่น:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
    					
  14. กด F5 เพื่อคอมไพล์ และรันโปรแกรมประยุกต์อีกครั้ง
  15. เรียกใช้คำสั่งจากขั้นตอนที่ 12 ในตัววิเคราะห์คำถามอีกครั้ง ขอให้สังเกตว่าแบบสอบถามส่งกลับแถวเนื่องจากธุรกรรมไม่สามารถเสร็จสมบูรณ์
บันทึกย่อ:
  • ตัวอย่างนี้ทำการจัดการข้อผิดพลาด
  • SQL Server และผู้ประสาน Microsoft แจกจ่ายธุรกรรมงาน (MS DTC) ต้องทำงานอยู่บนเครื่องไคลเอนต์และเซิร์ฟเวอร์ทั้งหมด

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความด้านล่างเพื่อดูบทความในฐานความรู้ของ Microsoft:
306296วิธีการ: สร้างการให้บริการสุทธิส่วนประกอบที่ใช้ในธุรกรรมใน Visual C#สุทธิ

คุณสมบัติ

หมายเลขบทความ (Article ID): 316247 - รีวิวครั้งสุดท้าย: 28 มกราคม 2554 - Revision: 3.0
ใช้กับ
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Keywords: 
kbcompiler kbhowtomaster kbsqlclient kbsystemdata kbmt KB316247 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:316247

ให้ข้อเสนอแนะ

 

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