كيفية استخدام المعاملات COM + في مكون Visual C#

ملخص

توضح هذه المقالة خطوة بخطوة كيفية استخدام المعاملات COM + (خدمات المكونات) في فئة Visual C#. تعتبر مجموعة من عمليات قاعدة وحدة واحدة. أما تنجح كافة العمليات، أو في حالة فشل عملية واحدة، تفشل العملية بالكامل. في هذه الحالة الأخيرة، لن يتم ترحيل أية عمليات قاعدة البيانات، حوكم بقاعدة البيانات المصدر.


العودة إلى أعلى

متطلبات

تصف العناصر التالية في الأجهزة الموصى بها، البنية الأساسية للشبكة، المهارات والمعارف والبرامج حزم الخدمات التي يجب أن يكون لديك:
  • Microsoft Windows 2000 Server SP1
  • Microsoft معلومات خدمات الإنترنت الإصدار 4.0 أو أحدث
  • إصدارات Microsoft Internet Explorer 5.0 أو 5.5 أو 6.0
تفترض هذه المقالة أنك على دراية بما يلي:
  • مفاهيم المعاملات ومعالجة
  • COM + (خدمات المكونات)
العودة إلى أعلى

خدمات المعاملات COM +

يمكن تطبيق الحركة معالجة مع مساحة الاسم System.EnterpriseServices في Microsoft.NET Framework. للوصول إلى خدمات المعاملات COM +، إنشاء فئة. للقيام بذلك، اتبع الخطوات التالية:
  1. يبدأ Visual Studio.NET أو Visual Studio 2005.
  2. في القائمة ملف ، أشر إلى
    جديد، ثم انقر فوق المشروع.
  3. انقر فوق مشاريع Visual C# ضمن
    أنواع المشروع، ثم انقر فوق مكتبة الفئاتضمن قوالب. اسم المشروع
    برجينتيربريسي.

    ملاحظة: في Visual Studio 2005، انقر فوق Visual C# ضمن
    أنواع المشروع، ثم انقر فوق مكتبة الفئاتضمن قوالب. اسم المشروع
    برجينتيربريسي.
  4. بشكل افتراضي، يتم إنشاء Class1.
  5. في "مستكشف الحلول"، انقر بالزر الأيمن
    مراجع، ثم انقر فوق إضافة مرجع.
  6. يظهر مربع الحوار إضافة المرجع . ضمن اسم المكون في علامة التبويب .NET ، انقر نقراً مزدوجاً فوق System.EnterpriseServices.
  7. تأكد من ظهور System.EnterpriseServicesضمن المكونات المحددة. انقر فوق موافق.
  8. إضافة التعليمات البرمجية التالية قبل إلى أية بيانات في ملف Class1.cs:
    using System.EnterpriseServices;using System.Data.SqlClient;
  9. إضافة فئة جديدة تسمى clsES إلى الملف Class1.cs.
  10. لاستخدام "خدمات" COM + المعاملات، الفئة الخاصة بك (clsES) يجب أن ترث وظيفة ServicedComponent كما يلي:
    public class clsES : ServicedComponent
  11. يتم استخدام سمة الحركة لتحديد مستوى دعم المعاملات للفئة كما يلي:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. إنشاء أسلوب في الفئة clsES ، وتسميته dbAccess يتلقى أربعة معلمات إدخال عدد صحيح. أولاً المعلمتين توفير معرف منتج والوحدات في أمر لهذا المنتج. ثانيا المعلمتين توفير معرف منتج والوحدات الموجودة بالمخزن لهذا المنتج. هذا الأسلوب يقوم بتنفيذ مجموعة من عمليات قاعدة البيانات ضد هذه المعرفات الموجودة في أن يعامل معاملة المنتج المحدد:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. في أسلوب dbAccess ، إنشاء كائن اتصال SQL لقاعدة بيانات Northwind، ومن ثم فتح الاتصال. تحدث عمليات قاعدة البيانات باستخدام قاعدة البيانات التالية:

    ملاحظة: تذكر أن تقوم بتغيير معلمات سلسلة الاتصال التالية لعكس القيم الصحيحة لخادم SQL Server الخاص بك.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");Conn.Open();

  14. تعيين كتلة حاول التقاط أي الاستثناءات التي قد تحدث أثناء معالجة قاعدة البيانات. يجب التقاط هذه الاستثناءات إحباط المعاملة. تتضمن كتلة try عمليتين من قاعدة البيانات. كل عملية تحديث حقل مختلف في سجل جدول منتجات محددة.
     try { 
  15. إجراء التحديث الأول لجدول "المنتجات". تحديث حقل الوحدات _ المطلوبة بالقيمة onOrder للمنتج باستخدام معرف، كما هو محدد في معلمات الإدخال الأول والثاني. استخدام أمر SQL التالي لتشغيل هذا التحديث SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);sqlCommand.ExecuteNonQuery();
  16. إجراء تحديث آخر لجدول "المنتجات". تحديث حقل الوحدات _ بالمخزن inStock قيمة للمنتج باستخدام معرف، كما هو محدد في معلمات الإدخال الثالث والرابع. استخدام أمر SQL التالي لتشغيل هذا التحديث SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;sqlCommand.ExecuteNonQuery();

  17. لأن هذه التحديثات جزء من معاملة COM +، وملتزمة كوحدة. يتم استخدام أسلوب سيتكومبليتي الفئة contextUtil من مساحة الاسم System.EnterpriseServices لتنفيذ المعاملة (في هذه الحالة هما تحديث) إذا تم طرح أية أخطاء:
    ContextUtil.SetComplete();
  18. تم إغلاق الاتصال بقاعدة بيانات Northwind:
    Conn.Close();}
  19. يجب التقاط أي الاستثناءات التي تحدث أثناء تشغيل أوامر SQL بحيث يمكن إحباط المعاملة بالكامل:
    catch(Exception e){ 
  20. يتم استخدام أسلوب سيتابورت الفئة contextUtil من مساحة الاسم System.EnterpriseServices إحباط العملية بالكامل. إذا كان التحديث الأول بنجاح وفشل التحديث الثاني، يتم ترحيل أي تحديث لجدول "المنتجات". يتم طرح استثناء محدد إلى المستدعي، تشير إلى فشل الحركة:
    ContextUtil.SetAbort();throw e;
    }
  21. لهذا المكون بشكل صحيح، يجب أن يكون المكون اسم قوي. إنشاء اسم قوي، ثم قم بتسجيل التجميع مع اسم قوي. للقيام بذلك، اتبع الخطوات التالية:
    1. اكتب في موجه الأوامر Visual Studio.NET,
      snEnterprise.snk ك sn.exe لإنشاء ملف مفتاح. لمزيد من المعلومات حول توقيع التجميعات ذات الأسماء القوية، راجع وثائق.NET Framework SDK.
    2. نسخ snEnterprise.snk إلى مجلد المشروع الخاص بك.
    3. في AssemblyInfo.vc، أضف السطر التالي من التعليمات البرمجية قبل أو بعد آخر عبارات سمات التجميع:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]
    4. حفظ ومن ثم بناء المشروع الخاص بك.
العودة إلى أعلى

إتمام سرد التعليمات البرمجية

ملاحظة: تذكر أن تقوم بتغيير معلمات سلسلة الاتصال التالية لعكس القيم الصحيحة لخادم SQL Server الخاص بك.
using System;using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{

[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
{
public SqlConnection Conn;

public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
{
try
{
SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
Conn.Open();

SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
sqlCommand.ExecuteNonQuery();

sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
sqlCommand.ExecuteNonQuery();

ContextUtil.SetComplete();
Conn.Close();
}
catch(Exception e)
{
ContextUtil.SetAbort();

throw e;
}
finally
{

}
}
}
}

العودة إلى أعلى

تحقق من أنه يعمل

لاختبار هذه التعليمات البرمجية، قم بإنشاء تطبيق وحدة تحكم يستخدم المشروع clsES. وفي إحدى الحالات، نجاح عملية، و onorder و instock يتم تحديث الحقول للمنتج المحدد. في الحالة الثانية، لحقل onOrder لمنتج محدد نجاح التحديث، لكن التحديث inStock الحقل لفشل منتج لرقم المنتج المحدد غير موجود في جدول "المنتجات". يؤدي هذا إلى فشل حركة، وتجاهل المعاملة.
  1. في Visual Studio.NET أو Visual Studio 2005، أشر إلى جديد
    في القائمة ملف ، ثم انقر فوق المشروع.
  2. انقر فوق مشاريع Visual C# ضمن
    أنواع المشروع، ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.

    ملاحظة: في Visual Studio 2005، انقر فوق Visual C# ضمن
    أنواع المشروع، ثم انقر فوق تطبيق وحدة التحكم ضمن قوالب.
  3. في مربع النص الاسم ، اكتب
    الخصيتين. تأكد من تحديد الخيار إضافة إلى الحل .
  4. انقر فوق "موافق" لإضافة هذا المشروع إلى الحل.
  5. ل التجارب لاختبار clsES، يجب إضافة مرجع. في "مستكشف الحلول"، انقر بالزر الأيمن
    مراجع تحت الخصيتين (الذي قمت بإضافته)، ثم انقر فوق إضافة مرجع.
  6. يظهر مربع الحوار إضافة المرجع . ضمن علامة التبويب ' المشاريع '، انقر نقراً مزدوجاً فوق
    برجينتيربريسي.
  7. يظهر مرجع تحت المكونات المحددة. انقر فوق "موافق" لإضافة هذا المرجع إلى المشروع.
  8. إضافة مرجع إلى المشروع مكتبة System.EnterpriseServices. في "مستكشف الحلول"، انقر بالزر الأيمن
    مراجع، ثم انقر فوق إضافة مرجع
    .
  9. يظهر مربع الحوار إضافة المرجع . ضمن اسم المكون في علامة التبويب .NET ، انقر نقراً مزدوجاً فوق System.EnterpriseServices.
  10. تأكد من ظهور System.EnterpriseServicesضمن المكونات المحددة. انقر فوق موافق.
  11. انقر نقراً مزدوجاً فوق تطبيق وحدة التحكم (الخصيتين) ومن ثم انقر فوق تعيين "مشروع بدء التشغيل"
  12. قم بلصق مصدر التعليمة البرمجية التالية في الدالة الرئيسي الفئة Class1 :
    prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    try
    {
    myTest.dbAccess(1, 777, 2, 888);
    Console.WriteLine("TRANSACTION ONE -- SUCCESS");

    myTest.dbAccess(1, 5, 2, -20);
    Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    }
    catch (Exception e)
    {
    Console.WriteLine("TRANSACTION FAILURE");
    }
  13. اضغط F5 لتشغيل التعليمات البرمجية للاختبار.

    في التعليمات البرمجية في الخطوة 7، نجح الاستدعاء الأول إلى dbAccess . المنتج 1 و 2 منتج يتم في الجدول "منتجات". يتم تحديث الحقل onOrder للمنتج 1 إلى 777، و inStock الحقل ليتم تحديث المنتج 2 إلى 888. لأن نجاح هذه الحركة، تتلقى الرسالة التالية في إطار الإخراج
    نجاح حركة واحدة-


    فشل الاستدعاء الثاني إلى dbAccess . لذلك، يتم ترحيل أي عبارة update في dbAccess إلى جدول "المنتجات" لقاعدة البيانات. على الرغم من أنه يمكن أن يكون المنتج 1 حقل onOrder الخاص بها تحديث إلى 5، لا يمكن أن يكون المنتج 2 به inStock تعيين الحقل إلى -20. وبسبب قيود الذي يتم تعريفه في تعريف جدول المنتج، inStock غير مسموح به للأرقام السالبة.

    لذلك، يفشل هذا الاستدعاء إلى dbAccess ثم تفشل العملية بالكامل. يبقى الجدول "منتجات" كما كان قبل استدعاء dbAccess. يعالج عبارة catch إعلام فشل الحركة من dbAccess، وتتلقى رسالة الخطأ التالية في إطار الإخراج:
    فشل الحركة
  14. فحص محتويات الجدول "منتجات Northwind" باستخدام SQL Server Enterprise Manager. عندما تقوم بعرض المنتج 1، حقل onOrder تساوي 777. عندما تقوم بعرض المنتج 2 instock 888 هي الحقل. لذلك، يفشل الاستدعاء الثاني إلى dbAccess (الذي سيؤدي إلى قيم مختلفة لهذه الحقول).
العودة إلى أعلى

استكشاف أخطاء وإصلاحها

  • تأكد من أن أي مشروع يستخدم خدمات COM + يحتوي على اسم قوي.
  • يجب أن يرث أي الفئة التي تستخدم خدمات COM + من المكونات المخدومة. توجد المكونات المخدومة في مساحة الاسم System.EnterpriseServices .
  • أثناء تصحيح الأخطاء، قد مهلة معاملة قبل أن يتم الالتزام بها أو إحباطها. لتجنب مهلة، استخدم خاصية مهلة على سمة الحركة. في المثال التالي، يحتوي الأسلوب المقترن 1200 ثانية لإكمال أي معاملة قبل انقضاء المهلة المحددة:
    [Transaction(TransactionOption.Required,timeout=1200)]
العودة إلى أعلى

المراجع

لمزيد من المعلومات، قم بزيارة مواقع ويب شبكة مطوري Microsoft (MSDN) التالية:
COM + التكامل: كيف يمكن أن تساعدك.NET Enterprise Services البناء توزيع التطبيقات
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
العودة إلى أعلى
خصائص

رقم الموضوع: 816141 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 1

تعليقات