هل يمكن لبيان العودة منع بيان استخدام من إغلاق اتصال بقاعدة بيانات؟

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

سؤال

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

لدي الكود التالي:

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}

يمكنني استخدام هذا النوع من التعليمات البرمجية في عدة أماكن لإنشاء جدول TEMP بنفس الاسم.

لسوء الحظ، أحصل على الخطأ التالي: There is already an object named '#MyTempTable' in the database.

الآن، أعرف أن جدول TEMP فريد من نوعه للدورة، وهكذا بمجرد إغلاق الجلسة، يجب أن تختفي.

هناك ثلاثة أشياء أعتقد أنها قد تسبب هذا ...

  1. أحتاج إلى الاتصال بالاتصال. close ()
  2. أحتاج إلى وضع عبارة العودة خارج بيان الخاص بي
  3. أحتاج إلى إسقاط جدول TEMP الذي أنشأته قبل العودة

لا أحد يعرف أي واحد؟ أو إذا كان هناك شيء لم أفكر فيه؟

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

المحلول

أنا أظن هنا ولكن تحقق من إعدادات تجمع قاعدة البيانات الخاصة بك. حاول تحويل التجمع لمعرفة ومعرفة ما إذا كان ذلك يساعد.

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

يمكنك تحويل إيقاف التجمع (غير فعال للغاية). أو يمكنك التحقق من وجود جدول مؤقت قبل محاولة إنشاءه وحذف محتواه إذا كان موجودا. أو يمكنك إسقاط جدول مؤقت قبل إغلاق الاتصال.

نصائح أخرى

أنا متأكد من أنه سيتم استدعاء الاتصال.

يمكنك التحقق من ذلك بسهولة كافية من خلال القيام 1) و 2) والتحقق من أن المشكلة لا تزال موجودة. ربما يكون الحل 3) وسيكون التفسير تجمع اتصالات.

ما لم يحدث دورة الطاقة أو سيتم استدعاء بعض التخلص من حالة الزاوية الغريبة بشكل خطير.

إذا كنت تريد لف دليل على الكائن ووضع نقطة توقف في.

يترجم كتلة باستخدام TRY / CATCK / أخيرا تحت غطاء محرك السيارة. نعم، سوف تتخلص بغض النظر عن العودة داخل كتلة الاستخدام.

لا، سيتم دائما استدعاء الاتصال. دائما بسبب داخليا استخدام يضعه في محاولة / كتلة أخيرا.

قد ترغب أيضا في النظر في تجمع الاتصالات. حاول التخلص من التعليمات البرمجية الخاصة بك في المعاملات.

للإجابة على أسئلتكم:

  1. سيقوم العبارة الواجبة بإغلاق الاتصال ضمنا، عند استدعاء طريقة التخلص من الاتصال.
  2. لا ينبغي أن تكون ضرورية: http://aspadvice.com/blogs/name/archive/2008/05/22/2300_-Using-Stat.aspx.
  3. جربها.

سيؤدي استخدام العبارة إلى التخلص من الكائن إذا كان فئته ناهيا حتى هناك عبارة عودة داخل كتلة الاستخدام.

إنه تجمع الاتصال الذي يحافظ على #temberable، قد ترغب في إسقاط هذا الجدول يدويا.

دون معرفة المزيد عن مكتبة اتصال قاعدة البيانات قيد الاستخدام، أعتقد أنها ليست من أول اثنين؛ using تم تقديمه خصيصا لجعل تنظيف هذه الموارد أسهل عند العودة من الأساليب؛ انها مماثلة مباشرة إلى عادي try...finally كتلة في جافا أو مماثلة.

بمعنى آخر، return سوف تترك الكتلة و Dispose سيتم استدعاء الطريقة على الاتصال، والتي ينبغي أن تنفذ تنفيذ عاقل من هذا Close طريقة كجزء من هذه العملية.

النقطة الرئيسية هنا هي "تنفيذ عاقل".

إنه ناتج عن تجمع الاتصالات. لف ما تفعله في معاملة، وتراجعه في النهاية. أو، إسقاط جدول TEMP بعد ملء DS.

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