मैं 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
रों किसी भी मामले में, कोई प्रभाव नहीं पड़ा।
क्या किसी ने इसे देखा है और सफलतापूर्वक हल किया है/इसके आसपास काम किया है?
नहीं, दुर्भाग्य से मैं नहीं कर सकता। डेटाटेबल लोड हो रहा है जब तक मैं इसे अपने डेटा कॉलम में से किसी एक को अभिव्यक्ति लागू करने के लिए पकड़ लेता हूं। मैं कॉलम को हटा सकता हूं और उसके बाद आपके द्वारा सुझाए गए कोड का उपयोग कर इसे फिर से जोड़ सकता हूं, लेकिन क्या कोई विशेष कारण है कि आंतरिक इंडेक्स को हल करने से समस्या खराब हो जाएगी?
"कुछ अभिव्यक्ति" क्या वास्तविक है? क्या आपने http://tinyurl.com/7tj8av में नामकरण सम्मेलन का पालन किया था? – balexandre
मुझे एक ही त्रुटि का सामना करना पड़ा है और यह मेरे लिए तय है: [स्टैक ओवरव्लो - आंतरिक अनुक्रमणिका दूषित है] (http://stackoverflow.com/a/34154179/3119607) – mrc
यह त्रुटि मेरे लिए कोशिश करते समय मेरे लिए फसल हो गई डेटासेट पर एक चयन क्वेरी चलाएं। यह तब हुआ जब वहां कुछ ऐसी चीज खोज रही थी जो कुछ ऐसी चीज की खोज करते समय नहीं हुई थी। मुझे एहसास हुआ कि जब मैंने एक नई डेटा पंक्ति बनाई और इसे जोड़ा, तो मैं तालिका को अंतिम चरण तक लॉक नहीं कर रहा था जहां मैंने तालिका में पंक्ति जोड़ दी थी। जब मैं नई पंक्ति घोषित करता हूं और लॉक को तब तक रिलीज़ नहीं करता जब तक कि मैं इसे तालिका में नहीं जोड़ता, मुझे वास्तव में इसे लॉक करना पड़ा। यह मेरे कोड का एक पूरी तरह से अलग हिस्सा था जहां से त्रुटि हुई। – Grungondola