HOW TO: تنفيذ معاملات الموزعة باستخدام موفر .NET باستخدام ServicedComponent في Visual C# .NET

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية316247
للحصول على إصدار Microsoft Visual Basic .NET من هذه المقالة، راجع 316627.

تشير هذه المقالة إلى مساحات أسماء Microsoft .NET Framework فئة مكتبة التالية:
  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

في هذه المهمة

الموجز
توضح هذه المقالة خطوة بخطوة حول كيفية تنفيذ معاملة الموزّعة باستخدام موفر .NET مع الفئة ServicedComponent. على الرغم من أن تستخدم هذه المقالة موفر .NET SqlClient إلى ملقم Microsoft SQL Server ، يمكنك أيضاً استخدام موفر المدارة ODBC أو OLE DB .NET.

back to the top

متطلبات

توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة و حزم الخدمات المطلوبة:
  • ملقم متقدم Microsoft Windows 2000 Microsoft Windows 2000 Professional ، Microsoft Windows 2000 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 أو Microsoft SQL Server 2000
back to the top

نظرة عامة حول

يمكن المشاركة مثيلات الفئة .NET Framework في إحدى معاملات تلقائي إذا تحضير فئة للقيام بذلك. enlists لكل مورد تقوم بالوصول إلى مثيل فئة أو كائن في المعاملة. على سبيل المثال، إذا كان يستخدم كائن ADO.NET لنشر الأموال على حساب في قاعدة بيانات "، يحدد إدارة الموارد لقاعدة ما إذا كان الكائن يتم تشغيلها في معاملة. إذا كان يجب تشغيل الكائن في معاملة ، enlists إدارة الموارد تلقائياً في قاعدة بيانات في المعاملة.

استخدم العملية التالية لإعداد فئة للمشاركة في إحدى معاملات تلقائي:
  1. تطبيق فئة TransactionAttribute الفئة لتحديد نوع المعاملة التلقائي يتطلب المكون.

    يجب أن يكون نوع المعاملة عضو التعداد TransactionOption.
  2. اشتقاق الفصل الدراسي من فئة ServicedComponent. هو ServicedComponent الفئة الأساسية كافة فئات تستخدم خدمات COM +.
  3. توقيع التجميع باستخدام اسم المميز للتأكد من أن يحتوي التجميع على زوج مفاتيح فريدة.
  4. تسجيل التجميع الذي يحتوي على الفئة مع كتالوج COM +.

    ملاحظة: إذا العميل الذي يستدعي بمثيل الفئة يديره إلى وقت تشغيل اللغة العامة يتم إجراء التسجيل لك. هذه الخطوة مطلوبة فقط إذا كان طالب غير مدار بإنشاء يستدعي مثيلات الفئة الخاص بك. استخدام أداة تثبيت خدمات .NET (Regsvcs.exe) لتسجيل التجميع يدوياً.
للحصول على مزيد من المعلومات حول كيفية تسجيل تجميع باستخدام اسم المميز راجع الموضوع التالي في دليل المطور Microsoft .NET Framework:
توقيع تجميع باسم قوية
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
لمزيد من المعلومات حول هذه العملية راجع الموضوع التالي في دليل المطور Microsoft .NET Framework:
معاملات التلقائي "و".NET Framework فئات
http://msdn.microsoft.com/en-us/library/ms123400.aspx
back to the top

إنشاء المشروع

  1. اتبع الخطوات التالية لإنشاء مشروع "تطبيق وحدة تحكم" جديد في Visual C# .NET:
    1. بدء تشغيل Visual Studio .NET.
    2. من القائمة ملف، أشر إلى جديد ثم انقر فوق المشروع.
    3. في مربع الحوار مشروع جديد ، انقر فوق Visual C# مشاريع ضمن أنواع Project انقر فوق تطبيق وحدة التحكم ضمن قوالب ثم ثم انقر فوق موافق.
    4. في "مستكشف الحلول" إعادة تسمية الملف 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 .NET ، أشر إلى أدوات .NET Visual Studio ثم انقر فوق موجه الأوامر .NET Visual Studio.
  8. افتح المجلد الذي يحتوي على المشروع ثم قم بتشغيل الأمر التالي لإعادة تسجيل التجميع مع اسم المميز:
    كيلو sn 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]GOCREATE TABLE [dbo].[TestTransaction] (	[Col1] [int] NULL ,	[Col2] [varchar] (100) NULL ) ON [PRIMARY]GO 					
  11. تشغيل التطبيق الخاص بك. لاحظ ظهور رسالة الخطأ التالية (وهو السلوك المتوقع):
    إرجاع Aborted المعاملة: الخطأ: اسم الكائن غير صالح '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) على كافة العملاء والملقمات.
back to the top
مراجع
للحصول على معلومات إضافية، انقر فوق رقم المقالة أدناه لعرضها في "قاعدة المعارف لـ Microsoft:
306296HOW TO: إنشاء مكون .NET Serviced التي استخدام المعاملات في Visual C# .NET

تحذير: تمت ترجمة هذه المقالة تلقائيًا

Свойства

ИД на статията: 316247 – Последен преглед: 09/04/2003 20:36:34 – Редакция: 3.3

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Enterprise Services (included with the .NET Framework) 1.0, Microsoft Enterprise Services (included with the .NET Framework 1.1)

  • kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316247 KbMtar
Обратна връзка