TransactionScope خطأ ضد Sql Server 2000 - الشريك معاملة مدير تعطيل الدعم عن بعد/شبكة المعاملات

StackOverflow https://stackoverflow.com/questions/320986

سؤال

أنا أحاول إعداد بسيطة المعاملة بلدي Linq إلى Sql الإجراءات ضد Sql server 2000 البيانات الخاصة بنا.باستخدام TransactionScope يبدو مثل هذا:

using (TransactionScope transaction = new TransactionScope())
{
    try
        {
        Store.DBDataContext dc = new Store.DBDataContext();
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

ومع ذلك ، وأظل الحصول على الخطأ التالي:

الشريك معاملة مدير تعطيل الدعم عن بعد/شبكة المعاملات.(استثناء من HRESULT:0x8004D025)

ولكن إذا قمت بإعداد المعاملات باستخدام المعاملات التقليدية, أنه يعمل بشكل جيد.لذلك هذا يعمل بشكل جيد:

Store.DBDataContext dc = new Store.DBDataContext();
try
{
    dc.Connection.Open();
    dc.Transaction = dc.Connection.BeginTransaction();
    Store.Product product = GetProduct("foo");
    dc.InsertOnSubmit(product);
    dc.SubmitChanges(); 
    dc.Transaction.Commit();
}
catch (Exception ex)
{
    dc.Transaction.Rollback();
    throw ex;
}
finally
{
    dc.Connection.Close();      
    dc.Transaction = null;
}

أنا أتساءل عما إذا كان TransactionScope تفعل شيئا مختلفا تحت الأغطية من التنفيذ الثانية.لو لا ما أنا فقدان بعدم استخدام TransactionScope?أيضا, أي توجيهات بشأن ما تسبب في حدوث الخطأ ستكون جيدة جدا.لقد أكد أن MSDTC يعمل في كل من sql server على جهاز العميل.

هل كانت مفيدة؟

المحلول

ونلقي نظرة هنا:

والمعاملات سريعة مع System.Transactions و Microsoft SQL Server 2000 http://blogs.msdn.com/florinlazar/archive/2005 /09/29/475546.aspx

وهنا:
http://forums.microsoft.com/MSDN/ShowPost.aspx؟PostID = 230390 & SiteID = 1

<اقتباس فقرة>   

أولا التحقق من خدمة "توزيع منسق المعاملات" هي   يعمل على كل من أجهزة الكمبيوتر الكمبيوتر وعميل خادم قاعدة البيانات
  1. انتقل إلى "أدوات إدارية> خدمات"
  2. قم بتشغيل خدمة "توزيع منسق المعاملات" إذا لم يكن قيد التشغيل

     

إذا كان يعمل وتطبيق العميل ليس على نفس الكمبيوتر   خادم قاعدة البيانات على خادم قاعدة البيانات الكمبيوتر بنظام التشغيل
  1. انتقل إلى "أدوات إدارية> خدمات المكونات"
  2. في شجرة التنقل الأيمن، انتقل إلى "خدمات المكونات> أجهزة كمبيوتر> جهاز الكمبيوتر" (قد تحتاج إلى النقر المزدوج والانتظار كما بعض العقد   تحتاج وقتا لتوسيع)
  3. انقر بزر الماوس الأيمن على "جهاز الكمبيوتر"، اختر "خصائص"
  4. حدد "MSDTC" علامة التبويب
  5. انقر فوق "تكوين الأمان"
  6. تأكد من تحقق "شبكة DTC الوصول"، "السماح العميل البعيد"،   "السماح الواردة / الصادرة"، "تمكين TIP" (قد لا تكون بعض الخيار   من الضروري، أن يكون محاولة للحصول على التكوين الخاص بك)
  7. سيتم إعادة تشغيل الخدمة
  8. ولكن قد تحتاج إلى إعادة تشغيل الخادم الخاص بك إذا كان لا يزال لا يعمل   (وهذا هو الشيء قاد لي مجنون من قبل)

     

في الكمبيوتر العميل استخدام نفس الإجراء أعلاه لفتح   "تكوين الأمان" الإعداد، تأكد من تحقق "DTC الشبكة   وصول "،" السماح الواردة / الصادرة "الخيار، إعادة تشغيل خدمة والكمبيوتر   إذا لزم الأمر.

     

في لك SQL مدير خدمة الملقم، انقر فوق "الخدمة" المنسدلة، حدد   "توزيع منسق المعاملات"، فإنه يجب أن يشغل أيضا على   الكمبيوتر الخادم الخاص بك.

نصائح أخرى

وتنفيذ DatabaseTransactionAdapter في فلورين لازار بوست أن كيث Sirmons أشار لي إلى يبدو أن تفعل خدعة. وهنا رمز بلادي أن يسميها:

Store.DBDataContext dc = new Store.DBDataContext();
using (TransactionScope transaction = new TransactionScope())
{
    try
    {
        var dbAdapter = new DatabaseTransactionAdapter(dc.Connection);
        dc.Connection.Open();
        dbAdapter.Begin();
        dc.Transaction = (SqlTransaction)dbAdapter.Transaction;
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

والشيء الوحيد الذي يجعلني غير مستقر هو أنني لست إغلاق صراحة اتصال على الرغم من انها لم تعلن ضمن "باستخدام" بيان.

ولكن وفقا لفلورين لازار، وهذا عن قصد.

<اقتباس فقرة>   

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

الخطوات لتمكين هذا على ويندوز 2008 أو في وقت لاحق هي:

تحقق أولا "توزيع منسق المعاملات" الخدمة يعمل على كل ملقم قاعدة بيانات الكمبيوتر أجهزة الكمبيوتر العميلة

  1. انتقل إلى "أدوات إدارية > الخدمات"
  2. بدوره على "توزيع منسق المعاملات" الخدمة إذا لم يكن قيد التشغيل

إذا كان يتم تشغيل تطبيق العميل ليس على نفس الكمبيوتر مثل خادم قاعدة البيانات على الكمبيوتر الذي يشغل ملقم قاعدة البيانات

  1. انتقل إلى "أدوات إدارية > خدمات المكونات"
  2. على اليسار شجرة التنقل ، انتقل إلى "خدمات المكونات > أجهزة الكمبيوتر > جهاز الكمبيوتر > منسق المعاملات الموزعة" (قد تحتاج إلى انقر نقرا مزدوجا فوق وانتظر بعض العقد تحتاج إلى وقت من أجل توسيع)
  3. انقر على الحق في "المحلية DTC" ، اختر "خصائص"
  4. اختر التبويب "أمان"
  5. تأكد من التحقق من "وصول DTC الشبكة", "السماح العميل البعيد", "السماح الواردة/الصادرة"
  6. الخدمة سيتم إعادة تشغيل
  7. ولكن قد تحتاج إلى إعادة تشغيل الخادم الخاص بك إذا كان لا يزال لا يعمل (هذا هو الشيء الذي يقود لي مجنون من قبل)

على جهاز الكمبيوتر العميل استخدام نفس الإجراءات المذكورة أعلاه لفتح "تكوين الأمان" الإعداد ، تأكد من التحقق من "وصول DTC الشبكة", "السماح الواردة/الصادرة" خيار إعادة تشغيل خدمة الكمبيوتر إذا لزم الأمر.

على SQL server الخاص بك مدير خدمة, انقر فوق "خدمة" المنسدلة ، اختر "توزيع منسق المعاملات" ، يجب أن تكون أيضا تعمل على الخادم الخاص بك الكمبيوتر.

وأكثر لاحظ أن: - دليل تكوين الملقم تمكين الوصول إلى الشبكة COM + (ويندوز سيرفر 2003) بدء ==> لوحة التحكم ==> إضافة أو إزالة البرامج ==> إضافة / إزالة مكونات Windows، حدد ملقم التطبيق، ومن ثم انقر فوق تفاصيل. انقر فوق تمكين COM شبكة + الوصول، ثم انقر فوق موافق. انقر فوق التالي، ثم انقر فوق إنهاء.
- إذا كان بين 2 الخادم لديك جدار حماية، وجدار الحماية مفتوحة لكل من داخل / خارج على هذا المنفذ المدى: انقر فوق ابدأ ==> لوحات التحكم ==> أدوات إدارية ==> خدمات المكونات. توسيع خدمة المكونات توسيع أجهزة الكمبيوتر، انقر بزر الماوس الأيمن على جهاز الكمبيوتر واختر خصائص. في نافذة خصائص جهاز الكمبيوتر، انقر فوق علامة التبويب بروتوكول الافتراضي، انقر على مهيأ للاتصال TCP / IP واختر خصائص. في النافذة الجديدة، انقر فوق إضافة واكتب تتراوح الموانئ DTC جديدة. انقر على OK لتطبيق هذه التغيير. يجب أن يكون الخادم إعادة تشغيل لسارية المفعول التغيير الجديد

أنشر أدناه الحل هنا لأنه بعد بعض البحث هذا هو المكان الذي هبطت لذا أخرى قد أيضا.كنت أحاول أن استخدام EF 6 إلى استدعاء إجراء مخزن ، ولكن كان خطأ مشابهة لأن الإجراء المخزن كان ملقم مرتبط يجري استخدامها.

العملية لا يمكن أن يؤديها لأن موفر OLE DB _ ملقم مرتبط _ كان غير قادر على بدء المعاملات الموزعة

الشريك معاملة مدير تعطيل الدعم عن بعد/شبكة المعاملات

القفز فوق إلى عميل SQL هل إصلاح المشكلة ، الذي أيضا أكد لي أنه كان EF شيء.

EF نموذج الأسلوب الذي تم إنشاؤه على أساس محاولة:

db.SomeStoredProcedure();

ExecuteSqlCommand القائمة على المحاولة:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

مع:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

هذا الرمز يمكن اختصارها ، ولكن أعتقد أن هذا الإصدار هو قليلا أكثر ملاءمة من أجل التصحيح و التنقل خلال.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top