मैं कोड की निम्न बिट जो एक 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
आप अपने कोड को थ्रेड में चला सकते हैं और उस फ़ंक्शन में thread.abort को कॉल कर सकते हैं – SamFisher83
+1: मुझे ऐसे प्रश्न पसंद हैं जहां मैं इसे पढ़ने से कुछ सीखता हूं। – NotMe