سؤال

في هذه الجملة:

myCommand.ExecuteReader(CommandBehavior.CloseConnection)

وأنه لا صلة وثيقة في حالة استثناء؟

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

المحلول

وهناك الكثير من الطرق التي الأمر يمكن أن تسوء.

وفي نهاية المطاف هو أسلوب إغلاق للقارئ البيانات التي سيتم إغلاق الاتصال، بشرط شيء قد ذهب خاطئ من قبل.

وإذا كان هناك استثناء الذي يحدث داخل اكسيكوتيريدير أو أي من وسائلها ودعا، قبل أن يتم بناؤه كائن DataReader الفعلي، ثم لا، لن يتم إغلاق الاتصال.

في حالة استثناء، وأنا لن تثق به لإغلاق الاتصال.

نصائح أخرى

والطريق الأسلم للقيام استعلام "الطبيعي" هو

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "...";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // ...
            }
        }
    }
}

ويمكن صيدها الاستثناءات خارج هذا الرمز.

وهذا يعتمد حيث يحدث استثناء!

إذا هيكلة الصيد المحاولة بشكل صحيح، وسوف يكون على ما يرام.

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

SqlCommand myCommand = new SqlCommand();

try
{
   myCommand.dostuff();
}
catch(Exception ex)
{
  // display error message
}
finally
{
  myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}

وإذا كان الخط: فشل myCommand.ExecuteReader (CommandBehavior.CloseConnection) (؟ ربما قاعدة البيانات قد انخفض) ثم الاتصال لا يمكن إغلاق برمجيا

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