2012-03-15 17 views
5

मैं कोड की निम्न बिट जो एक SQL विवरण चलाता है:एसक्यूएल त्रुटि का पता नहीं लगा सकते हैं

int rowsEffected = 0; 
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString)) 
{ 
    try 
    { 
     dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage); 
     dbConnection.FireInfoMessageEventOnUserErrors = true; 

     dbConnection.Open(); 


     SqlCommand command = dbConnection.CreateCommand(); 
     command.CommandTimeout = 0; 
     command.CommandText = sqlStatement; 

     rowsEffected = command.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     // Handle exception 
    } 
} 

दीर्घ परिचालन SQL कथन के साथ RAISERROR का उपयोग कर एक त्रुटि बढ़ाकर SqlInfoMessageEventHandler के माध्यम से प्रगति रिपोर्ट कर सकते हैं उचित गंभीरता मूल्य।

FireInfoMessageEventOnUserErrors को सही करने के कारणों को सही करने के कारण यह है कि, इसके बिना, SQL कथन से सभी संदेश केवल एक बार में संसाधित होते हैं जब ExecuteNonQuery() लौटाता है। इस मान को सत्य पर सेट करने के साथ, प्रगति संदेशों को संसाधित किया जाता है क्योंकि वे SQL कथन द्वारा उठाए जाते हैं।

जैसा कि संपत्ति के नाम से पता चलता है, ईवेंट हैंडलर त्रुटियों पर भी आग लगती है न कि केवल SQL गंभीरता से प्रगति प्रतिक्रिया के लिए आरक्षित विशिष्ट गंभीरता स्तर पर।

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    if (e.Errors.Count > 0) 
    { 
     throw new Exception("Something bad happened"); 
    } 

    // Report progress 
} 

आप देख सकते हैं, मैं भीतर 'ई' लेकिन अपवाद फेंक कुछ नहीं करता संपत्ति से एक त्रुटि तब होती है जब पता लगा सकते हैं:

प्रगति प्रतिक्रिया के लिए ईवेंट हैंडलर इस तरह दिखता है । मैं उम्मीद कर रहा था कि निष्पादन कैच ब्लॉक में गिर जाएगा लेकिन यह मामला नहीं है।

ExcecuteNonQuery() विधि के बाद मैं एक त्रुटि उत्पन्न करने के बाद कैसे निर्धारित कर सकता हूं?

TIA

+0

आप अपने कोड को थ्रेड में चला सकते हैं और उस फ़ंक्शन में thread.abort को कॉल कर सकते हैं – SamFisher83

+1

+1: मुझे ऐसे प्रश्न पसंद हैं जहां मैं इसे पढ़ने से कुछ सीखता हूं। – NotMe

उत्तर

3

में देखें, मैं चारों ओर एक काम करने में कामयाब रहा। मैंने कक्षा में एक संपत्ति जोड़ा है जिसमें ईवेंट हैंडलर है। अगर कोई त्रुटि हुई, तो मैंने उस वर्ग में त्रुटि ध्वज संपत्ति भेजी जिसे बाद में ExcecuteNonQuery() पर कॉल के बाद पढ़ा जा सकता है। अगर कोई त्रुटि हुई तो मैं अपना क्लीन-अप कोड कर सकता हूं। उत्तर के लिए धन्यवाद।

+0

कृपया उत्तर के रूप में इस उत्तर को चिह्नित करें – Marcin

+0

मुझे कुछ ऐसा करना था, लेकिन ऐसी स्थिति के लिए जहां बाहरी थ्रेड को डीबी कमांड ऑब्जेक्ट तक पहुंचना था, इसलिए मैंने पिछली बार इस्तेमाल की गई एसक्यूएल कॉल को संभावित रूप से चेक या रद्द कर दिया जा सकता था एक और धागा – Brain2000

1

उपयोग SqlException बजाय वर्ग Exception वर्ग। और फिर e.Errors

+0

उत्तर के लिए धन्यवाद। मैं वास्तव में अपवाद का उपयोग नहीं कर रहा हूं, मैं एक कस्टम अपवाद का उपयोग कर रहा हूं लेकिन केवल नमूना कोड के लिए मैंने इसे अपवाद में बदल दिया है। आपके पास ExcecuteNonQuery() को कॉल करने वाले कोड में e.Errors तक पहुंच नहीं है। – millie

संबंधित मुद्दे