كيفية إغلاق الاتصال / datareader عند استخدام SqlDataSource أو ObjectDataSource

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

سؤال

وخلال اختبار بيتا اكتشفنا تجمع الاتصالات رسائل الخطأ. لذا فقد كان يمر رمز وإغلاق الكائنات SqlDataReader أينما كانوا قد تركت مغلق. ما تحتاج إلى معرفته هو كيفية إغلاق datareader (أو إذا كان هناك حاجة على الإطلاق لإغلاق) الذي تم تحديده في سمة SelectStatement من SqlDataSource أو ObjectDataSource العلامات. يمكن أن يكون هناك تسرب الاتصال إذا لم يتم التعامل معها؟

ويرجع الفضل في ذلك مسبقا!

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

المحلول

وأنا أميل إلى استخدام "باستخدام" الكلمة الرئيسية، خاصة عند التعامل مع فتح وإغلاق الاتصالات إلى قاعدة البيانات. "باستخدام" هو اختصار للنمط التصرف - هنا هو ارتباط إلى writeup MSDN، و هنا هو وصلة لدخول بلوق مفيدة مع لمحة عامة.

نصائح أخرى

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

وعلى سبيل المثال:

            using (var cmd = ... ))
            {
                using (var reader = (DbDataReader) cmd.ExecuteReader())
                {
                    try
                    {
                        ConsumeData(reader); // may throw
                    }
                    catch(Exception)
                    {
                        cmd.Cancel();
                        throw;
                    }
                }
            }

وما أفهمه هو أنه مع SqlDataSource، يتم تنفيذ إدارة الاتصال بالنسبة لك، وعليك ألا تخشى شيئا.

لا تتحدث ObjectDataSource إلى قاعدة البيانات مباشرة في المقام الأول، لذلك سوف تكون آمنة - طالما أن الكائن الأساسي بإجراء اتصال وإدارتها القارئ بشكل صحيح

وكما ذكر آخرون، Close() وusing هي أصدقائك للفئات التي تستخدمها مع ObjectDataSource.

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

وكان لدينا نفس المشاكل هنا في بيئة الإنتاج.

وحل القضية. كانت المشكلة لأول مرة، لم تكن هناك بيانات باستخدام على الإطلاق في قانون بلدي. (كان بناء بضع سنوات مضت، مع بعض أقل المعرفة).

وبعد ذلك حاولت وضع SqlDataSource في بند استخدام. ولكن هذا لم يساعد أيضا.

والخدعة هنا هو، تماما مثل tvanfosson وميشا ويقترح، ووضع القارئ في بند استخدام. هذا هو الكائن الذي يغلق في الواقع الاتصال.

وتقلص عدد الاتصالات إلى الحد الأدنى لحجم تجمع من 10 في حمولة المتوسط.

وأعتقد أن SqlDataSource على التعامل معها من مشكلات الاتصال / القارئ الخاصة، لذلك لا تقلق هناك. أما بالنسبة للاتصالات اليدوية، لقد وجدت هذا النمط من المفيد في الماضي:

   using (SqlConnection connection = new SqlConnection(connectionString))
   {
      try
      {
         SqlCommand command = connection.CreateCommand();
         command.CommandText = ...

         connection.Open();
         using (SqlDataReader reader = command.ExecuteReader())
         {
            do
            {
               while (reader.Read())
               {
                  ... handle each row ...
               }
            } while (reader.NextResult());
         }
      }
      catch (Exception ex)
      {
          ... error handling ...
      }
      finally
      {
         if (connection != null && connection.State == ConnectionState.Open)
         {
            connection.Close();
         }
      }
  }

وأنا أتفق، أن لObjectDataSource ينبغي التعامل معها في الختام منهجه تحديد. لي طريقة ObjectDataSource اختر إرجاع SqlDataReader. و... سيتم تقديم قلقي على SqlDataReader عديمة الفائدة عندما أغلقت بعد عودته إلى واجهة المستخدم. مثلا رؤية نموذج التعليمات البرمجية التالية. لم أحاول ذلك، ولا تريد أن تفعل ذلك في هذه المرحلة من التنمية.

SqlDataReader MySelectMethod(){
   SqlDataReader dr = null;
   try{
      dr = DBObject.GetDataReader();
      return dr;
   }
   finally{
      dr.Close();
   }
}

وشكرا لجميع المدخلات تلقى حتى الآن!

و...........

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

وما أفهمه هو أنه مع   SqlDataSource، إدارة الاتصال   يتم تنفيذ بالنسبة لك، وعليك   لا خوف.

     

وObjectDataSource لا يتحدث ل   قاعدة البيانات مباشرة في المقام الأول،   لذلك سوف تكون آمنة - طويلة مثل   الكائن الأساسي يقوم بها   اتصال والقارئ إدارة   بشكل صحيح.

     

وكما ذكر آخرون، إغلاق () و   باستخدام وأصدقائك للطبقات   استخدام مع ObjectDataSource

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