ऐसा इसलिए है क्योंकि DataAdapter
Optimistic Concurrency
. का उपयोग करता है डिफ़ॉल्ट रूप से। इसका अर्थ यह है कि यदि आप किसी ऐसी पंक्ति को अद्यतन करने का प्रयास कर रहे हैं जो अब डेटाबेस में मौजूद नहीं है या परिवर्तित हो गई है, तो DataAdapter
से अद्यतन उपरोक्त अपवाद के साथ विफल हो जाएगा।
संभावित परिदृश्य :
- क्लाइंट में डेटा का चयन करने और अपडेट भेजने के बीच, कोई अन्य उपयोगकर्ता इस पंक्ति को अपने एप्लिकेशन से हटा रहा है या अपडेट कर रहा है।
- हो सकता है कि आप अपने आवेदन में कहीं और से डेटा हटा रहे हों।
उदाहरण के लिए :
- आप
DataTable
भरते हैं जिसका उपयोग अपडेट के लिए किया जाएगा। - पंक्ति को
Code = 1101
के साथ हटाता है (उदाहरण के लिए) सीधे डेटाबेस से, यानी आपDataTable
. का उपयोग नहीं करते हैं यहाँ। यह एक अन्य उपयोगकर्ता का अनुकरण कर रहा है जोCode = 1101
. के साथ पंक्ति को हटा रहा है दूसरे आवेदन से। या आपके कोड का कोई अन्य भागCode = 1101
. के साथ पंक्ति को हटा रहा है । - पंक्ति को
Code = 1101
के साथ चुनता हैDataTable
. से , यह केवल यह दिखाने के लिए है कि यह अभी भी वहीं है, भले ही आपने इसे डेटाबेस से ही हटा दिया हो। Quantity
का संपादन करता हैCode = 1101
. के साथ पंक्ति में कॉलमDataTable
. में . यह करना होगा, अन्यथा अपडेट करने के लिए कॉल अपडेट करते समय इस पंक्ति को अनदेखा कर देगा।- अपडेट निष्पादित करता है, यह अपवाद को फेंक देगा क्योंकि आप उस पंक्ति को अपडेट करने का प्रयास कर रहे हैं जो (अब नहीं) डेटाबेस में मौजूद है।
यदि आप Last Writer Wins
लागू करना चाहते हैं , निम्नलिखित कोड जोड़ें:
cb.ConflictOption = ConflictOption.OverwriteChanges;
इसके अलावा एक और संभावित बात है:यदि आपके पास Decimal
है /numeric
डीबी में कॉलम के रूप में वे इस त्रुटि का कारण बन सकते हैं, भले ही डेटा समान दिखता हो। यह एक दशमलव पूर्णांकन त्रुटि के कारण है।
एक महत्वपूर्ण नोट :आपको हमेशा parameterized queries
का उपयोग करना चाहिए वैसे। इस प्रकार के स्ट्रिंग संयोजन SQL Injection
के लिए खुले हैं ।