سؤال

أحتاج إلى اكتشاف استثناءات مهلة خادم SQL على وجه التحديد حتى يمكن التعامل معها بشكل مختلف.أعلم أنه يمكنني التقاط SqlException ثم التحقق مما إذا كانت سلسلة الرسالة تحتوي على "مهلة" ولكن كنت أتساءل عما إذا كانت هناك طريقة أفضل للقيام بذلك؟

try
{
    //some code
}
catch (SqlException ex)
{

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}
هل كانت مفيدة؟

المحلول

للتحقق من انتهاء المهلة، أعتقد أنك تتحقق من قيمة ex.Number.إذا كانت -2، فهذا يعني أن لديك حالة انتهاء المهلة.

-2 هو رمز الخطأ الخاص بالمهلة، الذي تم إرجاعه من DBNETLIB، برنامج تشغيل MDAC لـ SQL Server.ويمكن ملاحظة ذلك عن طريق التنزيل العاكس, ، وابحث ضمن System.Data.SqlClient.TdsEnums عن TIMEOUT_EXPIRED.

سيكون الكود الخاص بك كما يلي:

if (ex.Number == -2)
{
     //handle timeout
}

رمز لإثبات الفشل:

try
{
    SqlConnection sql = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=YourServer,1433;Initial Catalog=YourDB;Integrated Security=SSPI;");
    sql.Open();

    SqlCommand cmd = sql.CreateCommand();
    cmd.CommandText = "DECLARE @i int WHILE EXISTS (SELECT 1 from sysobjects) BEGIN SELECT @i = 1 END";
    cmd.ExecuteNonQuery(); // This line will timeout.

    cmd.Dispose();
    sql.Close();
}
catch (SqlException ex)
{
    if (ex.Number == -2) {
        Console.WriteLine ("Timeout occurred");
    }
}

نصائح أخرى

هنا: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-10/msg00064.html

يمكنك أن تقرأ أيضا ذلك توماس وينجارتنر كتب:

نفذ الوقت:SqlException.Number == -2 (هذا رمز خطأ ADO.NET)
خطأ عام في الشبكة:SqlException.Number == 11
طريق مسدود:SqlException.Number == 1205 (هذا رمز خطأ SQL Server)

...

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

تم التحديث لـ c#6:

    try
    {
        // some code
    }
    catch (SqlException ex) when (ex.Number == -2)  // -2 is a sql timeout
    {
        // handle timeout
    }

بسيطة جدا وجميلة للنظر!!

ما هي قيمة الخاصية SqlException.ErrorCode؟هل يمكنك العمل مع ذلك؟

عند وجود مهلات، قد يكون من المفيد التحقق من الرمز -2146232060.

سأقوم بإعداد هذا باعتباره ثابتًا ثابتًا في كود البيانات الخاص بك.

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