سؤال

ينفذ التعليمة البرمجية التالية أمر إدراج بسيط.إذا تم استدعاؤه 2000 مرة متتالية (لإدراج 2000 صف)، فسيتم طرح OleDbException مع الرسالة = "System Resources Exceeded".هل هناك شيء آخر يجب أن أفعله لتحرير الموارد؟

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
هل كانت مفيدة؟

المحلول

خطأ تجاوز موارد النظام لا يأتي من التعليمات البرمجية المُدارة، بل يأتي منك مما أدى إلى قتل قاعدة البيانات الخاصة بك (JET؟)

أنت تفتح الطريق أمام العديد من الاتصالات، طريقة سريعة...

بعض النصائح:

  • تجنب الرحلات ذهابًا وإيابًا من خلال عدم فتح اتصال جديد لكل أمر على حدة، وقم بإجراء عمليات الإدراج باستخدام اتصال واحد.
  • تأكد من أن تجمع اتصال قاعدة البيانات يعمل (لست متأكدًا مما إذا كان ذلك يعمل مع اتصالات OLEDB).
  • فكر في استخدام طريقة أكثر تحسينًا لإدراج البيانات.

هل جربت هذا؟

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

نصائح أخرى

واختبرت هذا الرمز خارجا مع قاعدة بيانات Access 2007 مع أية استثناءات (ذهبت يصل الى 13000 إدراج).

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

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

وأيضا، إذا كان ذلك ممكنا، وأود أن ننظر في استخدام المعاملات. لا استطيع ان اقول ما كنت تستخدم هذا الرمز ل، ولكن OleDbTransactions مفيدة عند إدخال وتحديث العديد من الصفوف في قاعدة بيانات.

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

وبعد بعض البحث، وجدت (طبعا) أن Access لا تؤدي بشكل جيد في هذه البيئة. لا يحصلون على الإفراج عن الموارد بشكل صحيح وعلى مر الزمن القابل للتنفيذ سوف ينفد. لحل هذه المشكلة، ونحن نذهب للانتقال إلى قاعدة بيانات أوراكل. إذا كان هذا لا يحل المشكلة، وسوف تبقي لكم تحديث على استنتاجاتي.

وهذا يمكن أن يحدث لأنك لا تخلص اتصال وكائن الأوامر التي تم إنشاؤها. تخلص دائما الكائن في نهاية المطاف.

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