कैसे SQLServer टाइमआउट अपवादों को पकड़ने के लिए


117

मुझे विशेष रूप से SQL सर्वर टाइमआउट अपवादों को पकड़ने की आवश्यकता है ताकि उन्हें अलग तरीके से संभाला जा सके। मुझे पता है कि मैं SqlException को पकड़ सकता हूं और फिर जांच सकता हूं कि क्या संदेश स्ट्रिंग में "टाइमआउट" है, लेकिन सोच रहा था कि क्या ऐसा करने का कोई बेहतर तरीका है?

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

    if (ex.Message.Contains("Timeout"))
    {
         //handle timeout
    }
    else
    {
         throw;
    }
}

क्या आप एक कनेक्शन टाइमआउट या कमांडटाइमआउट की तलाश कर रहे हैं, क्या आप असफल होने के लिए कनेक्शन की उम्मीद कर रहे हैं या असफल कमांड निष्पादित कर रहे हैं?
एडोसॉफ्ट

मैं एक कमांडटाइमआउट की तलाश कर रहा हूं, जो कि 30 सेकंड के डिफ़ॉल्ट रूप से मुझे लगता है कि सेट है
ब्रोडी

जवाबों:


157

टाइमआउट की जाँच करने के लिए, मेरा मानना ​​है कि आप ex.Number का मान जाँचते हैं। यदि यह -2 है, तो आपके पास टाइमआउट की स्थिति है।

-2 टाइमआउट के लिए त्रुटि कोड है, SQL सर्वर के लिए MDAC ड्राइवर DBNETLIB से लौटा है। इसे Reflector को डाउनलोड करके , TIMEOUT_EXPIRED के लिए System.Data.SqlClient.TdsEnums के तहत देखा जा सकता है ।

आपका कोड पढ़ जाएगा:

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");
    }
}

हाँ, यह बहुत ज्यादा है जो मैं इस समय कर रहा हूं, लेकिन यह -2 के लिए बहुत ही सुंदर जाँच नहीं है
ब्रोडी

12
Red Gate का प्रतिक्षेपक डाउनलोड करें, और TIMEOUT_EXPIRED को खोजें। यह System.Data.SqlClient.TdsEnums में रहता है, और इसका मूल्य -2 है। : ओ)
जोनाथन

2
उन लोगों के लिए जिनके पास रिफ्लेक्टर तक पहुंच नहीं है: लिंक
अंकित

4
@ ब्रोडी यही कारण है कि आपको इसके लिए एक निरंतर बनाना चाहिए और आप बता सकते हैं कि "जादू" का मूल्य निरंतर पर एक टिप्पणी में कहां से आया।
जेसन एल।

18

यहाँ: 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 सर्वर त्रुटि कोड है)

...

हम "सामान्य नेटवर्क त्रुटि" को टाइमआउट अपवाद के रूप में भी संभालते हैं। यह केवल दुर्लभ परिस्थितियों में होता है जैसे कि जब आपका अपडेट / इंसर्ट / डिलीट क्वेरी लंबे समय तक चलने वाला ट्रिगर बढ़ाएगा।


6

C # 6 के लिए अपडेट किया गया:

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

देखने में बहुत ही सरल और अच्छा !!


0

SqlException.ErrorCode प्रॉपर्टी के लिए क्या मान है? क्या आप इसके साथ काम कर सकते हैं?

समय समाप्त होने पर, यह -2146232060 कोड की जाँच करने के लायक हो सकता है ।

मैं इसे आपके डेटा कोड में स्थिर कास्ट के रूप में स्थापित करूँगा।


2
ErrorCode के डॉक्स को देखते हुए, यह मुझे लगता है कि यह इंटरॉप-स्तर की त्रुटियों की रिपोर्ट कर रहा है। तो यह COM त्रुटियों के स्तर पर अधिक हो सकता है या एक प्रदाता को एक विशिष्ट त्रुटि के बजाय एक अपवाद (आमतौर पर) का सामना करना पड़ता है जो आप कर रहे हैं।
एरिक टटलमैन

@ एरिक सही है - यह SqlException प्रकार के लिए एक HRESULT कोड है, अपवाद के स्रोत के लिए नहीं।
कोडकाइजन

0

मुझे यकीन नहीं है, लेकिन जब हमने टाइम आउट या कमांड टाइम निष्पादित किया है, तो क्लाइंट SQL सर्वर को "ABORT" भेजता है और फिर क्वेरी प्रोसेसिंग को छोड़ देता है। कोई लेन-देन वापस नहीं किया जाता है, कोई भी लॉक जारी नहीं किया जाता है। इस समस्या को हल करने के लिए, मैं स्टोर-प्रक्रिया में लेनदेन को हटाता हूं और sqlException प्रबंधित करने के लिए अपने .Net कोड में SQL लेनदेन का उपयोग करता हूं


-2

जब कोई ग्राहक ABORT भेजता है, तो कोई लेनदेन वापस नहीं किया जाता है। इस व्यवहार से बचने के लिए हमें SET_XACT_ABORT का उपयोग करना होगा https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-ver15


1
यह इस सवाल का जवाब नहीं देता है कि सी # कोड में कमांड टाइमआउट कैसे पकड़ा जाए
जोनाथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.