2009-01-16 14 views
23

मैं 3.5 .NET फ्रेमवर्क के विरुद्ध चल रहे सी # में .NET WinForms ऐप के साथ काम कर रहा हूं। इस एप्लिकेशन में, मैं एक DataTable में एक DataColumn की .Expression सदस्य की स्थापना कर रहा हूँ, इसलिए जैसे: 2 लाइन, जहां मैं वास्तव में Expression सेटडेटाटेबल आंतरिक इंडेक्स दूषित

DataColumn column = dtData.Columns["TestColumn"]; 
column.Expression = "some expression"; 

, कभी कभी निम्न अपवाद में परिणाम होगा:

FileName= 
LineNumber=0 
Source=System.Data 
TargetSite=Int32 RBInsert(Int32, Int32, Int32, Int32, Boolean) 
System.InvalidOperationException: DataTable internal index is corrupted: '5'. 
    at System.Data.RBTree`1.RBInsert(Int32 root_id, Int32 x_id, Int32 mainTreeNodeID, Int32 position, Boolean append) 
    at System.Data.RBTree`1.RBInsert(Int32 root_id, Int32 x_id, Int32 mainTreeNodeID, Int32 position, Boolean append) 
    at System.Data.Index.InitRecords(IFilter filter) 
    at System.Data.Index.Reset() 
    at System.Data.DataTable.ResetInternalIndexes(DataColumn column) 
    at System.Data.DataTable.EvaluateExpressions(DataColumn column) 
    at System.Data.DataColumn.set_Expression(String value) 

कोई समझदार कविता या कारण नहीं है जब त्रुटि होगी; एक ही डेटा सेट लोड करने में, यह ठीक काम कर सकता है लेकिन फिर इसे पुनः लोड करना असफल हो जाएगा, और इसके विपरीत। इससे मुझे लगता है कि यह दौड़ की स्थिति से संबंधित है, जहां DataTable पर एक और लेखन ऑपरेशन हो रहा है क्योंकि मैं इसके कॉलम में से एक को संशोधित करने का प्रयास कर रहा हूं। हालांकि, DataTable से संबंधित कोड बहु-थ्रेडेड और केवल यूआई थ्रेड पर चलता है।

मैंने वेब और Microsoft forums खोजा है, और इस मुद्दे पर बहुत अधिक चर्चा और भ्रम है। जब 2006 में इस मुद्दे की पहली बार रिपोर्ट की गई थी, तो विचार था कि यह .NET ढांचे में एक दोष था, और कुछ अनुमानित हॉटफिक्सेस जारी किए गए थे जिन्हें संभावित रूप से .NET ढांचे के बाद के संस्करणों में घुमाया गया था। हालांकि, लोगों ने उन हॉटफिक्सेस को लागू करने में मिश्रित परिणाम की सूचना दी है, जो वर्तमान ढांचे पर लागू नहीं हैं।

एक और प्रचलित सिद्धांत यह है कि डेटाटेबल पर ऑपरेशन हैं, हालांकि प्रतीत होता है कि निर्दोष, वास्तव में ऑपरेशन लिख रहे हैं। उदाहरण के लिए, DataTable के आधार पर एक नया DataView बनाना वास्तव में तालिका पर एक लेखन ऑपरेशन है, क्योंकि यह बाद में संदर्भ के लिए DataTable में एक आंतरिक अनुक्रमणिका बनाता है। ये लिखने के ऑपरेशन थ्रेड-सुरक्षित नहीं होते हैं, इसलिए कभी-कभी ऐसा होता है कि दौड़ की स्थिति DataTable की हमारी पहुंच के साथ एक अनजान-सुरक्षित लेखन की ओर ले जाती है। बदले में, DataTable की आंतरिक अनुक्रमणिका दूषित हो जाती है, जिससे अपवाद होता है।

मैं के रूप में मैंने पहले उल्लेख किया, उपयोग DataTable पिरोया नहीं है कोड कोड में एक DataView निर्माण के आसपास lock ब्लॉक डाल की कोशिश की है, लेकिन, है, और lock रों किसी भी मामले में, कोई प्रभाव नहीं पड़ा।

क्या किसी ने इसे देखा है और सफलतापूर्वक हल किया है/इसके आसपास काम किया है?


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

+0

"कुछ अभिव्यक्ति" क्या वास्तविक है? क्या आपने http://tinyurl.com/7tj8av में नामकरण सम्मेलन का पालन किया था? – balexandre

+0

मुझे एक ही त्रुटि का सामना करना पड़ा है और यह मेरे लिए तय है: [स्टैक ओवरव्लो - आंतरिक अनुक्रमणिका दूषित है] (http://stackoverflow.com/a/34154179/3119607) – mrc

+0

यह त्रुटि मेरे लिए कोशिश करते समय मेरे लिए फसल हो गई डेटासेट पर एक चयन क्वेरी चलाएं। यह तब हुआ जब वहां कुछ ऐसी चीज खोज रही थी जो कुछ ऐसी चीज की खोज करते समय नहीं हुई थी। मुझे एहसास हुआ कि जब मैंने एक नई डेटा पंक्ति बनाई और इसे जोड़ा, तो मैं तालिका को अंतिम चरण तक लॉक नहीं कर रहा था जहां मैंने तालिका में पंक्ति जोड़ दी थी। जब मैं नई पंक्ति घोषित करता हूं और लॉक को तब तक रिलीज़ नहीं करता जब तक कि मैं इसे तालिका में नहीं जोड़ता, मुझे वास्तव में इसे लॉक करना पड़ा। यह मेरे कोड का एक पूरी तरह से अलग हिस्सा था जहां से त्रुटि हुई। – Grungondola

उत्तर

0

तुम सिर्फ उपयोग नहीं कर सकते:

dtData.Columns.Add("TestColumn", typeof(Decimal), "Price * Quantity"); 
3

आप उल्लेख "threadsafe नहीं"। क्या आप ऑब्जेक्ट को विभिन्न धागे से जोड़ रहे हैं? यदि ऐसा है तो यह भ्रष्टाचार का कारण हो सकता है।

9

व्यक्तिगत रूप से, यह विशेष बग विभिन्न फैशनों में 3 सप्ताह के लिए मेरी दासता रही है। मैंने इसे अपने कोड बेस के एक हिस्से में हल कर लिया है और यह कहीं और दिखाता है (मुझे विश्वास है कि आखिरकार मैंने इसे आज रात मारा)। अपवाद जानकारी बल्कि अनुपयोगी है, और एक रेनडिएक्स को मजबूर करने का एक तरीका एमएस की कमी को हल करने के लिए एक अच्छी सुविधा होगी।

मैं एमएस के हॉटफिक्स की तलाश नहीं करता - उनके पास एक केबी आलेख है, फिर आपको एक एएसपी.Net फिक्स पर रीडायरेक्ट करता है जो पूरी तरह से असंबंधित है।

ठीक है - पर्याप्त शिकायत। चलो देखते हैं कि मैंने इस विशेष मुद्दे को हल करने में वास्तव में मेरी मदद की है:

  • डिफ़ॉल्ट दृश्यों का उपयोग करने से बचें, और यदि संभव हो तो डिफ़ॉल्ट दृश्य को संशोधित करना। बीटीडब्ल्यू, नेट 2.0 में विचार बनाने पर कई पाठक/लेखक ताले हैं, इसलिए वे समस्या नहीं हैं जो वे पहले 2.0 थे।
  • कॉल स्वीकार्य चेंज() जहां संभव हो।
  • इसके बारे में सावधान रहें। चयन (अभिव्यक्ति), क्योंकि इस कोड में कोई पाठक/लेखक लॉक नहीं है - और यह एकमात्र जगह है (कम से कम यूज़नेट पर किसी व्यक्ति के अनुसार, इसे नमक का अनाज - हालांकि, यह आपके मुद्दे के समान है - इसलिए म्यूटेक्स का उपयोग करने में मदद मिल सकती है)
  • प्रश्न में कॉलम को अनुमति दें (संदिग्ध मूल्य, लेकिन यूज़नेट पर रिपोर्ट - मैंने इसे केवल उन स्थानों पर उपयोग किया है जहां यह समझ में आता है)
  • सुनिश्चित करें कि आप डेटारो फ़ील्ड में शून्य (सी #)/कुछ भी नहीं (वीबी) सेट नहीं कर रहे हैं। शून्य के बजाय DBNull.Value का उपयोग करें। में केस आप यह जांचना चाहेंगे कि फ़ील्ड शून्य नहीं है, अभिव्यक्ति वाक्यविन्यास IsNull (val, alt_val) ऑपरेटर का समर्थन करता है।
  • इससे शायद मुझे सबसे अधिक (बेतुका लगता है) की मदद मिली है: यदि कोई मान नहीं बदल रहा है, तो इसे असाइन न करें। तो में केस आपके पूर्ण असाइनमेंट के बजाय इसका उपयोग करें:

    अगर (कॉलम.एक्सप्रेस! = "कुछ अभिव्यक्ति") कॉलम। एक्सप्रेशन = "कुछ अभिव्यक्ति";

(मैंने स्क्वायर ब्रैकेट को हटा दिया, यह सुनिश्चित नहीं किया कि वे वहां क्यों थे)।

संपादित करें (5/16/12): बार-बार इस समस्या में भाग गया (एक अल्ट्राग्रिड/अल्ट्राविनग्रिड के साथ)। डेटाव्यू पर सॉर्ट को हटाने की सलाह का उपयोग किया गया, और फिर डेटाव्यू सॉर्ट से मेल खाने वाले सॉर्ट किए गए कॉलम को जोड़ा गया, और इसने समस्या को हल किया।

2

मेरी समझ, इस समस्या पर लंबे और दर्दनाक छेड़छाड़ से, यह है कि यह गैर-थ्रेड-सुरक्षित लेखन संचालन का एक आर्टिफैक्ट है, जिसे आम तौर पर आप नहीं जानते थे कि आप बना रहे थे।

मेरे मामले में, अपराधी बाध्यकारी स्रोत प्रतीत होता था। मैंने पाया कि मुझे बाध्यकारी निलंबित करने की ज़रूरत है, जो भी ऑपरेशन मैं कोशिश कर रहा था, और फिर जब मैं किया गया था तब बाध्यकारी फिर से शुरू करें, और समस्या चली गई। यह 18 महीने पहले था, इसलिए मैं अब विवरणों पर स्पष्ट नहीं हूं, लेकिन मुझे लगता है कि बाध्यकारी स्रोत अपने स्वयं के धागे पर कुछ प्रकार का ऑपरेशन कर रहा है। (यह उस समय की तुलना में अब मुझे कम समझ में आता है।)

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

15

पंक्तियों को आयात करते समय मुझे बस एक ही समस्या थी, जैसा कि लगता है, DataTable.BeginLoadData को कॉल करने से पहले यह मेरे लिए तय किया गया था।

संपादित करें: जैसा कि यह पता चला है, यह केवल एक तरफ तय है, अब पंक्तियों को जोड़कर इस अपवाद को फेंकता है।

संपादित 2:Robert Rossney द्वारा सुझाए गए बाध्यकारी निलंबित करने के लिए भी मेरे लिए जोड़ने की समस्या तय की गई। मैंने DataGridView से DataSource को हटा दिया और DataTable के साथ किए जाने के बाद इसे पढ़ा।

संपादित 3: अभी भी तय नहीं है ... अपवाद गुरुवार से मेरे कोड में सभी अलग-अलग स्थानों में रेंग रहा है ... यह अब तक का सबसे अजीब और सबसे अच्छा **** आईएनजी बग है फ्रेमवर्क में अब तक (और मैंने 3 वर्षों में कई अजीब चीजें देखी हैं, मैं .NET 2.0 के साथ काम कर रहा हूं, यह गारंटी देने के लिए पर्याप्त है कि मेरी भविष्य की परियोजनाओं में से कोई एक भी इस पर निर्माण नहीं करेगा)। लेकिन विषय पर वापस, ranting के पर्याप्त है।

मैंने पूरी चर्चा at the Microsoft support forums पढ़ी है और मैं आपको इसका एक संक्षिप्त सारांश दूंगा। मूल bug report originates in '05

  • मार्च 06 से: बग पहली बार बताया जाता है, जांच शुरू होता है। अगले वर्ष के दौरान यह विभिन्न रूपों और विभिन्न अभिव्यक्तियों में रिपोर्ट किया जाता है।
  • मार्च '07: अंत में a hotfix with number KB 932491 जारी की है (अपनी आशाओं नहीं मिलता अप), यह a download of an completely irrelevant looking hotfix के खिलाफ लिंक, या कम से कम तो यह लगता है। अगले महीनों में कई रिपोर्टें हैं कि हॉटफिक्स काम नहीं करता है, कुछ सफलता की रिपोर्ट कर रहे हैं।
  • जुलाई '07: इस बिंदु से परे माइक्रोसॉफ्ट (लाइव बेकार जवाब के साथ) का अंतिम संकेत माइक्रोसॉफ्ट से कोई और प्रतिक्रिया नहीं है। कोई और पुष्टि नहीं, समर्थन पर कोई प्रयास नहीं, अधिक जानकारी के लिए कोई अनुरोध नहीं ... कुछ भी नहीं। इस बिंदु से परे केवल समुदाय से संबंधित जानकारी है।

कोई गंभीरता से, यह मेरी राय में यह बताता है। मैं पूरी चर्चा से निम्नलिखित जानकारी निकालने में सक्षम था:

  • DataTableनहीं थ्रेड-सुरक्षित है। यदि आपके पास कहीं भी मल्टी-थ्रेडिंग है तो आपको Lock/Synchronize करना होगा।
  • सूचकांक का भ्रष्टाचार से पहले वास्तविक अपवाद फेंक दिया जाता है।
  • एक संभावित भ्रष्टाचार स्रोत या तो लागू Expression या लागू Sort है।
  • एक और संभावित स्रोत DataTable.ListChanged() घटना है, इस घटना में डेटा को कभी भी संशोधित न करें या इससे उत्पन्न होने वाली किसी भी घटना को कभी भी संशोधित न करें। इसमें बाध्य नियंत्रण से अलग Changed ईवेंट शामिल हैं।
  • नियंत्रण के विरुद्ध DefaultView बाध्य करते समय संभावित समस्याएं हैं। हमेशा DataTable.BeginLoadData() और DataTable.EndLoadData() का उपयोग करें।
  • निर्माण और DefaultView के हेरफेर DataTable (और इसके Index) पर एक लेखन आपरेशन है, फ़्लाइंग स्पैगेटी मॉन्स्टर जानता कि क्यों।

इसका संभावित स्रोत संभवतया हमारे स्रोत कोड में या ढांचे के कोड में दौड़ की स्थिति है। ऐसा लगता है, माइक्रोसॉफ्ट इस बग को ठीक करने में असमर्थ है या इसका कोई इरादा नहीं है। किसी भी तरह से, दौड़ की स्थिति के लिए अपना कोड जांचें, इसकी राय में DefaultView के साथ कुछ करना है। किसी बिंदु पर Insert या डेटा का हेरफेर आंतरिक इंडेक्स को दूषित कर रहा है क्योंकि परिवर्तन पूरे DataTable के माध्यम से उचित रूप से प्रचारित नहीं होते हैं।

जब मैं और जानकारी या अतिरिक्त सुधार प्राप्त करता हूं तो मैं निश्चित रूप से रिपोर्ट करूंगा। और खेद है कि अगर मुझे थोड़ा भावनात्मक लगता है, लेकिन मैंने इस मुद्दे को दूर करने की कोशिश करने में तीन दिन बिताए हैं, और यह धीरे-धीरे एक नई नौकरी पाने के लिए एक अच्छे कारण की तरह दिखना शुरू कर देता है।

Edit4: मैं पूरी तरह से बाध्यकारी (control.DataSource = null;) को हटाने के द्वारा इस बग से बचने और फिर से जोड़ने के बाद डेटा की लोडिंग पूरा हो गया है यह करने में सक्षम था। जो मेरे विचारों को ईंधन देता है कि DefaultView और बाध्य नियंत्रण से उत्पन्न होने वाली घटनाओं के साथ इसका कुछ संबंध है।

+1

धन्यवाद बॉबी। मेरे बाइंडिंग स्रोत पर सॉर्ट एक्सप्रेशन को हटाने से यह मेरे लिए हल हो गया। मैं डेटा को सॉर्ट करने के किसी अन्य तरीके की जांच करूंगा। – Aranda

+1

मेरे पास मेरी सूची में एक अपडेट ओप था, कॉलबैक - मेरे लिए समस्या को ठीक करने के लिए –

1

यहां पर वही जांच, और एक अलग दृष्टिकोण की कोशिश की। मैं किसी भी स्क्रीन से संबंधित सामान (उदाहरण के लिए बाध्यकारी) के लिए डेटाटेबल का उपयोग नहीं कर रहा हूं; मैं बस DataRow ऑब्जेक्ट्स (एकाधिक थ्रेड में) बना रहा हूं और उन्हें तालिका में जोड़ रहा हूं।

मैंने लॉक() का उपयोग करने का प्रयास किया है, और पंक्तियों को जोड़ने के लिए सिंगलटन में जोड़ने की कोशिश की है, यह सोचने में मदद मिलेगी। ऐसा नहीं हुआ संदर्भ के लिए, यहां इस्तेमाल किया गया सिंगलटन है। हो सकता है कि कोई और इस पर निर्माण कर सके और कुछ समझ सके?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace EntityToDataSet 
{ 
    public class RowAdder 
    { 
     #region Data 
     private readonly object mLockObject = new object(); 
     private static RowAdder mInstance; 

     public static RowAdder Instance 
     { 
     get 
     { 
      if (mInstance == null) 
      { 
       mInstance = new RowAdder(); 
      } 
      return mInstance; 
     } 
     } 

     object mSync; 
     #endregion 

     #region Constructor 
     private RowAdder() 
     { 
     } 
     #endregion 

     public void Add(DataTable table, DataRow row) 
     { 
     lock (mLockObject) 
     { 
      table.Rows.Add(row); 
     } 
     } 
    } 
} 
+0

धन्यवाद, आपने मेरा दिन – User5590

1

कैसे इस तरह की स्थितियों में सूत्र में नींद के लिए प्रेरित करने described here के रूप में एक म्युटेक्स लागू करने के विचार की कोशिश कर के बारे में?

0

वही मेरे साथ भी हुआ। Winforms, .NET 3.5, अप्रत्याशित रूप से टाइप की गई पंक्ति में कॉलम में से किसी एक को सेट करने का प्रयास करने में यह त्रुटि मिली। कोड पुराना था और लंबे समय तक काम करता था, इसलिए यह अप्रिय आश्चर्यजनक था ...

मुझे डेटासेट टाडासेट में टाइप की गई तालिका TadaTable में नया सॉर्टनो सेट करने की आवश्यकता है।

मुझे क्या मदद की, आप भी इस कोशिश कर सकते हैं:

System.Data.DataTable dtNew = new DataTable(); 
for (int iCol = 0; iCol < dtOriginalData.Columns.Count; iCol++) 
{ 
    dtNew.Columns.Add(dtOriginalData.Columns[iCol].ColumnName, dtOriginalData.Columns[iCol].DataType); 
} 
for (int iCopyIndex = 0; iCopyIndex < item.Data.Rows.Count; iCopyIndex++) 
{ 
    dtNew.Rows.Add(dtOriginalData.Rows[iCopyIndex].ItemArray); 
    //dtNew.ImportRow(dtOriginalData.Rows[iCopyIndex]); 
} 
dtOriginalData = dtNew; 

का आनंद लें, एंड्रयू एम

1

यह मैं कैसे तय मेरी आंतरिक सूचकांक समस्या दूषित है है क्या आप एक ही समय में एकाधिक प्रक्रिया में समान डेटाटेबल का उपयोग कर रहे हैं .. मैंने SYNCLOCK का उपयोग करके इस समस्या का समाधान किया है ...

इस प्रयास करें ..

SyncLock your datatable 

'''' ----your datatable process 

End SyncLock 
0

मई:

int i = 0; 
foreach (TadaSet.TadaTableRow row in source) 
{ 
    row.BeginEdit(); //kinda magical operation but it helped :) 
    // Also you can make EndEdit() for each row later if you need... 
    short newNo = i++; 
    if (newNo != row.SortNo) row.SortNo = newNo; //here was the crash 
} 
0

मेरे मामले में फ्रेमवर्क संस्करण 2.0 है। किसी समस्या का स्रोत DataView ListChanged ईवेंट में था। नीचे दिया गया कोड कुछ पंक्तियों के साथ नई पंक्ति को प्रारंभ करता है।

private void dataView_ListChanged(object sender, ListChangedEventArgs e) 
{ 
    if (e.ListChangedType == ListChangedType.ItemAdded) 
    { 
     DataView v = (DataView)sender; 
     DataRowView drv = v[e.NewIndex]; 

     // This "if" works fine 
     if (drv["Foo"] == DBNull.Value) 
     { 
      drv["Foo"] = GetFooDefault(); 
     } 

     // This "if" brakes the internal index  
     if (drv["Bar"] == DBNull.Value && drv["Buz"] != DBNull.Value) 
     { 
      drv["Bar"] = drv["Buz"]; 
     } 
    } 
} 

कुछ जांच के बाद यह स्पष्ट हो गया कि आइटम जोड़ा गया ईवेंट प्रति पंक्ति कम से कम दो बार बुलाया जाता है।पहली बार जब यूआई डेटा और दूसरी बार प्रवेश करने के लिए नई लाइन बनाता है, तो मुझे यकीन नहीं है, लेकिन ऐसा लगता है कि डेटाव्यू व्यू को डेटाव्यू में जोड़ा गया है।

पहला "अगर" केवल तभी काम करता है जब आइटम एडवर्ड को पहली बार बुलाया जाता है। दूसरे कॉल पर "फू" कॉलम पहले से ही आबादी वाला है और बाकी है।

हालांकि "बार" कॉलम डिफॉल्ट कोड दोनों कॉल पर निष्पादित किया जा सकता है। असल में मेरे मामले में इसे केवल दूसरे आइटम पर आयोजित किया गया था, जब उपयोगकर्ता को "बुज़" कॉलम के लिए डेटा भरने का मौका मिला था (प्रारंभ में "बुज़" में डीबीएनयूएल मान है)।

तो यहाँ मेरी निष्कर्षों के आधार पर सिफारिशें है:

  • ListChanged घटना में डेटा बदला जा सकता है केवल जब e.ListChangedType == ListChangedType.ItemAdded
  • पहले स्तंभ मान की जांच सुनिश्चित करने के लिए है कि यह पहला ItemAdded घटना है प्रदर्शन किया जाना चाहिए की स्थापना करने के लिए (उदाहरण के लिए यदि मान दूसरी कॉल पर नल नहीं हो सकता, तो देखें कि यह DBNull.Value है आदि)
3

बस यह देखने की कोशिश कर रहे लोगों के लिए एक नोट कि इस बग को कैसे पुन: उत्पन्न किया जा सकता है। मेरे पास कुछ कोड है जो अक्सर उस त्रुटि का उत्पादन करेगा। यह समवर्ती पढ़ने/लिखने के आसपास लॉक करता है, लेकिन उस डेटा लॉकिंग के बाहर DataView.FindRows को कॉल किया जाता है। ओपी ने इंगित किया कि बना रहा है एक डेटा व्यू एक छिपे हुए लेखन ऑपरेशन था, यह भी एक पूछताछ कर रहा है?

//based off of code at http://support.microsoft.com/kb/932491 
using System.Data; 
using System.Collections.Concurrent; 
using System.Threading.Tasks; 
using System; 
public class GenerateSomeDataTableErrors 
{ 
    public static void Main() 
    { 
     DataTable Table = new DataTable("Employee"); 
     Table.Columns.Add("Id", typeof(int)); 
     Table.Columns.Add("Name", typeof(string)); 
     Table.PrimaryKey = new DataColumn[] { Table.Columns["Id"] }; 

     DataSet Employees = new DataSet(); 
     Employees.Tables.Add(Table); 

     DataRow ManagerB = Table.NewRow(); 
     ManagerB["ID"] = 392; 
     ManagerB["Name"] = "somename"; 
     Table.Rows.Add(ManagerB); 

     DataRow ManagerA = Table.NewRow(); 
     ManagerA["ID"] = 394; 
     ManagerA["Name"] = "somename"; 
     Table.Rows.Add(ManagerA); 

     Employees.AcceptChanges(); 

     object locker = new object(); 

     //key = exception string, value = count of exceptions with same text 
     ConcurrentDictionary<string, int> exceptions = new ConcurrentDictionary<string, int>(); 

     DataView employeeNameView = new DataView(Table, string.Empty, "Name", DataViewRowState.CurrentRows); 

     Parallel.For(0, 100000, (i, s) => 
     { 
      try 
      { 
       #region do modifications to the table, in a thread-safe fashion 
       lock (locker) 
       { 
        var row = Table.Rows.Find(392); 

        if (row != null) //it's there, delete it 
        { 
         row.Delete(); 
         Employees.AcceptChanges(); 
        } 
        else //it's not there, add it 
        { 
         var newRow = Table.NewRow(); 
         newRow["ID"] = 392; 
         newRow["Name"] = "somename"; 
         Table.Rows.Add(newRow); 
         Employees.AcceptChanges(); 
        } 
       } 
       #endregion 

       //Apparently this is the dangerous part, finding rows 
       // without locking on the same object the modification work is using. 
       //lock(locker) 
       employeeNameView.FindRows("somename"); 
      } 
      catch (Exception e) 
      { 
       string estring = e.ToString(); 
       exceptions.TryAdd(estring, 0); 
       lock (exceptions) 
       { exceptions[estring] += 1; } 
      } 
     }); 

     foreach (var entry in exceptions) 
     { 
      Console.WriteLine("==============The following occurred " + entry.Value + " times"); 
      Console.WriteLine(entry.Key); 
     } 
    }//Main 
}//class 

आप इसे चलाते हैं, तो के रूप में है आप इस तरह उत्पादन हो सकता है (उत्पादन कुछ हद तक हर बार जब आप इसे चलाने अलग है):

==============The following occurred 2 times 
System.InvalidOperationException: DataTable internal index is corrupted: '13'. 
    at System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex) 
    at System.Data.DataView.GetRow(Int32 index) 
    at System.Data.DataView.GetDataRowViewFromRange(Range range) 
    at System.Data.DataView.FindRowsByKey(Object[] key) 
    at GenerateSomeDataTableErrors.<>c__DisplayClass9.<Main>b__8(Int32 i, ParallelLoopState s) in Program.cs:line 110 
==============The following occurred 3 times 
System.IndexOutOfRangeException: Index 1 is either negative or above rows count. 
    at System.Data.DataView.GetRow(Int32 index) 
    at System.Data.DataView.GetDataRowViewFromRange(Range range) 
    at System.Data.DataView.FindRowsByKey(Object[] key) 
    at GenerateSomeDataTableErrors.<>c__DisplayClass9.<Main>b__8(Int32 i, ParallelLoopState s) in line 110 
==============The following occurred 1 times 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Data.DataView.GetRow(Int32 index) 
    at System.Data.DataView.GetDataRowViewFromRange(Range range) 
    at System.Data.DataView.FindRowsByKey(Object[] key) 
    at GenerateSomeDataTableErrors.<>c__DisplayClass9.<Main>b__8(Int32 i, ParallelLoopState s) in Program.cs:line 110 
Press any key to continue . . . 

और आप FindRows फोन पर ताला लगाना करते हैं, कोई अपवाद नहीं।

0

ऐसा लगता है कि मेरे सहयोगी करेन और आई के लिए काम किया गया है। हमें यह त्रुटि डेटाग्रिड व्यू में मिल रही थी, लेकिन केवल एक विशेष कॉलम में डेटा दर्ज करते समय।

यह पता चला है कि मैंने ग्रिड में कॉलम का क्रम बदल दिया है, यह नहीं जानते कि DataGridView.CellValidated सब में कोड था जो समस्या के कारण उस विशेष कॉलम में मान को कम करता है।

वह कोड एक विशिष्ट कॉलम संख्या निर्दिष्ट करता है। तो जब मूल DataGridView कॉलम 3 को स्थानांतरित कर दिया गया था और कॉलम 1 बन गया था, लेकिन DataGridView.CellValidated कोड अभी भी कॉलम 3 को संदर्भित किया गया है, त्रुटि हुई। हमारे कोड को बदलना ताकि यह सही ई। कॉलम इंडेक्स को संदर्भित करता है, ऐसा लगता है कि हमारी समस्या ठीक हो गई है।

(यह पता लगाने की हमारे कोड में यह एक नंबर बदलने के लिए आसान नहीं था मुझे आशा है कि यह सुधार आयोजित करता है।।)

1

मैं अपने datatable-आंतरिक अनुक्रमणिका त्रुटि इस तरह से समाधान किया गया:

बदल CellEndEditCellBeginEdit घटना के लिए। इसके अलावा ... अनावश्यक रूप से NULLs उपयोग करने से बचें:

Private Sub User_role_groupDataGridView_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles User_role_groupDataGridView.CellBeginEdit 
    Try 
     If Not Me.User_role_groupDataGridView.Rows(e.RowIndex).IsNewRow Then Me.User_role_groupDataGridView.Rows(e.RowIndex).Cells("last_modified_user_group_role").Value = Now 
    Catch ex As Exception 
     Me.displayUserMessage(ex.ToString, Me.Text, True) 
    End Try 
End Sub 
-1

मैं एक ही मुद्दे का सामना किया है और यह है कि क्या यह मेरे लिए तय है: Stack Overflow - internal index is corrupted

यदि आप किसी डेटासेट के साथ थ्रेड का उपयोग कर रहे हैं, तो वह त्रुटि होगी।

मेरे मामले में, मैं धागे में चल रहे किसी विधि के भीतर डेटासेट के लिए एक नई पंक्ति बनाने की कोशिश कर रहा था।

एक तरीका था सिंकलॉक जिस तरह से पंक्ति या अन्य तरीके (और शायद बेहतर) बनाता है, पंक्तियों के बाहर पंक्तियां बनाना था।

Dim elements As New List(Of element) 
    Dim dataRows As New List(Of MyDataSet.Row) 

    For i As Integer = 0 To elements.Count - 1 
     dataRows.Add(Me.Ds.Elements.NewElementsRow) 
    Next 

    Parallel.For(0, elements.Count, Sub(i As Integer) 
             Me.CreateElementRow(elements(i), dataRows(i)) 
            End Sub) 

CreateElementRow विधि मैं धागे में गणना का एक बहुत कर रहा हूँ में:

असल में मेरी कोड कुछ इस तरह लग रहा है।

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

1

मुझे डेटाग्रिडव्यू के लिए बाध्य डेटासेट में पंक्तियों को जोड़ने के लिए एक ही समस्या (तालिका सूचकांक 5 से दूषित) था। मैंने ध्यान नहीं दिया कि डेटाग्रिडव्यू के AddRow ईवेंट पर एक इवेंटहालर था, जो यूआई द्वारा नई पंक्ति शुरू करने के मामले में कुछ प्रारंभिकता करता है। अपवादों में स्टैक ट्रेस इसके बारे में कुछ भी नहीं देखा गया था। घटना को अक्षम करके मैं इस तेजी से हल कर सकता हूं। मैं यहां कुछ टिप्पणियों को गहराई से पढ़कर आया था। 2hours इस तरह के मुद्दों के लिए बहुत ज्यादा नहीं है :-), मुझे लगता है। आप डेटासेट से जुड़े डेटाग्रिडव्यू को आवंटित प्रत्येक ईवेंटहैंडर में ब्रेकपॉइंट सेट करके इसे पा सकते हैं।

+0

बचाया है, यह प्रश्न का उत्तर नहीं देता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/11345621) –

+0

@ वादिम हां, यह एक उत्तर प्रदान करता है। – Rob

0

मुझे थ्रेड का उपयोग कर एक ही समस्या थी। मैंने जो किया वह एक प्रतिनिधि बन गया जिसे मुझे टेबल को मर्ज करने की आवश्यकता होती है।

internal delegate void MergeData (DataTable dataTable1, DataTable dataTable2); 

internal static void MergeDataTable (DataTable dataTable1, DataTable dataTable2) 
{ 
    dataTable1.Merge (dataTable2, true); 
} 

फिर निष्पादन के दौरान मैं प्रतिनिधि फोन और त्रुटि नहीं होती है।

Delegates.MergeData mergeData = new Delegates.MergeData (Delegates.MergeDataTable); 

object [] paramsMerge = {dataTable1, dataTable2}; 

this.Invoke (mergeData, paramsMerge);