2008-09-26 3 views
31

मैं कैसे पता लगा सकता हूं कि कौन सा कॉलम और मान बाधा का उल्लंघन कर रहा है? अपवाद संदेश बिल्कुल उपयोगी नहीं है:डेटासेट लोड करते समय अवरोध अपवाद क्या ट्रिगर करता है?

बाधाओं को सक्षम करने में विफल। एक या अधिक पंक्तियों में गैर-शून्य, अद्वितीय, या विदेशी-कुंजी बाधाओं का उल्लंघन करने वाले मान होते हैं।

+2

मैं आपको और अधिक अप-वोट करता है, तो मैं कर सकता देना चाहते हैं। यह मेरी तरफ भी एक कांटा है। –

उत्तर

11

रोवरर नामक एक संपत्ति है जिसे आप चेक कर सकते हैं।

http://dotnetdebug.net/2006/07/16/constraintexception-a-helpful-tip/

संपादित इस लिंक को देखने के लिए जो किया था त्रुटियों पंक्तियों की यात्रा दिखा जोड़ने के लिए देखें।

http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic58812.aspx

20

कई लोगों की तरह, मैं अपने खुद के मानक डेटा का उपयोग घटक है, जो एक डेटासेट वापस जाने के लिए तरीकों में शामिल किया है। बेशक, अगर एक कॉन्स्ट्रेन्ट अपवाद फेंक दिया जाता है, तो डेटासेट कॉलर को वापस नहीं किया जाता है, इसलिए कॉलर पंक्ति त्रुटियों की जांच नहीं कर सकता है।

मैं क्या किया है, पकड़ और इस तरह के तरीकों में rethrow ConstraintException है पंक्ति त्रुटि विवरण प्रवेश करने, निम्न उदाहरण में (जो प्रवेश के लिए log4net का उपयोग करता है):

... 
try 
{ 
    adapter.Fill(dataTable); // or dataSet 
} 
catch (ConstraintException) 
{ 
    LogErrors(dataTable); 
    throw; 
} 
... 

private static void LogErrors(DataSet dataSet) 
{ 
    foreach (DataTable dataTable in dataSet.Tables) 
    { 
     LogErrors(dataTable); 
    } 
} 

private static void LogErrors(DataTable dataTable) 
{ 
    if (!dataTable.HasErrors) return; 
    StringBuilder sb = new StringBuilder(); 
    sb.AppendFormat(
     CultureInfo.CurrentCulture, 
     "ConstraintException while filling {0}", 
     dataTable.TableName); 
    DataRow[] errorRows = dataTable.GetErrors(); 
    for (int i = 0; (i < MAX_ERRORS_TO_LOG) && (i < errorRows.Length); i++) 
    { 
     sb.AppendLine(); 
     sb.Append(errorRows[i].RowError); 
    } 
    _logger.Error(sb.ToString()); 
} 
+0

आपकी लॉग इनर्स विधि बहुत बढ़िया है! सचमुच मुझे आज बचाया। – Dave

1

मैं कुछ कोड है कि मैं जोड़ा डीबगिंग में उपयोगी पाया गया है कॉन्स्ट्रेनट एक्सेप्शन घटनाएं here

उम्मीद है कि इससे मदद मिलती है।

3

जब आप एक मजबूत टाइप डाटासेट का उपयोग करें और दृश्य डिजाइनर (XSD) का इस्तेमाल किया: tbl.Rows [0] .RowError जानकारी का उपयोग करने के लिए, आप बनाने के लिए भरें विधि की जरूरत है।

आप प्राप्त विधि का उपयोग नहीं कर सकते हैं, क्योंकि डेटाटेबल जेनरेट कोड के भीतर इंस्टेंस किया गया है।

+0

जैसा आपने कहा था, आपको भरने की ज़रूरत है। बहुत अजीब; जब मुझे केवल कुछ डेटा (मूल चयन) मिल रहा है तो मुझे एक भरने का बयान क्यों चाहिए? कहीं सोचा कि इस फिल विधि का उपयोग .NET द्वारा किया जाता है। ऐसा लगता है। एक भरने की विधि उत्पन्न करने के बाद (प्राप्त करने पर कोई बदलाव नहीं) यह काम किया। – Obelix

1

Googlers जो एक टुकड़ा चाहते ConstraintException बारे में अधिक जानकारी प्राप्त करने के लिए के लिए:

try 
{ 
    ds.EnforceConstraints = true; 
} 
catch (ConstraintException ex) 
{ 
    string details = string.Join("", 
     ds.Tables.Cast<DataTable>() 
      .Where(t => t.HasErrors) 
      .SelectMany(t => t.GetErrors()) 
      .Take(50) 
      .Select(r => "\n - " + r.Table.TableName + "[" + string.Join(", ", r.Table.PrimaryKey.Select(c => r[c])) + "]: " + r.RowError)); 
    throw new ConstraintException(ex.Message + details); 
} 

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

  • कोई संबंधित समस्या नहीं^_^