MSSQL

5
में केवल एक नकली चाबी अपवाद अवरोधन के लिए एक रास्ता आवश्यकता

चलो कल्पना करें कि आप इस तरह 2008 डेटाबेस अपने MSSQL में एक अद्वितीय सूचकांक बाधा उल्लंघन मिल गया है:MSSQL

Violation of PRIMARY KEY constraint 'PK_ManufacturerCode'. Cannot insert duplicate key in object 'dbo.ManufacturerCode'. The duplicate key value is (8410179) 

वर्तमान में मैं एक वैश्विक द्वारा इस अपवाद हैंडलिंग हूँ एक मोटी क्लाइंट में अपवाद हैंडलर (एडीओ का उपयोग करके डेल्फी 6 में लिखा गया है, लेकिन इससे कोई फर्क नहीं पड़ता, मैं भविष्य में सी # .NET का उपयोग करने की योजना बना रहा हूं) और अपवाद संदेश लॉग बॉक्स में जोड़ा गया है।

लेकिन मैं इस विशिष्ट डुप्लिकेट कुंजी व्यक्तिगत रूप से अपवाद को संभालना चाहता हूं और मोटी क्लाइंट के अपने टेक्स्ट का उपयोग कर क्लाइंट में उचित त्रुटि संदेश प्रदर्शित करना चाहता हूं। मैं मैच के लिए त्रुटि संदेश को पार्स कर सकता हूं, लेकिन यह दो कारणों से नहीं करेगा:

  • यह करने का सही तरीका नहीं है - कुछ त्रुटि कोडों पर भरोसा करना बेहतर है;
  • मोटी ग्राहक विविध भाषाओं में MSSQL सर्वर संस्करण की किस्म का उपयोग करने के लिए जो अलग त्रुटि ग्रंथों
  • हो सकता है इरादा है

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

उत्तर

3

एडीओ में, आप त्रुटि के बाद Errors संपत्ति कनेक्शन का उपयोग करेंगे, और SQL सर्वर विशिष्ट त्रुटि संख्या प्राप्त करने के लिए NativeError संपत्ति की जांच करें।

आप नेट में स्विच करते हैं, एक ही नंबर SqlException की Number संपत्ति या SqlError

के रूप में सामने आ रहा है हालांकि, विशिष्ट त्रुटि संख्या खोजने एक घर का काम का एक सा हो सकता है - नकली चाबी के लिए, यह त्रुटि संख्या है 2627.

+0

आपका उत्तर मेरे लिए अच्छा लगता है, लेकिन ... क्या मैं इस तरीके का पता लगा सकता हूं कि कौन से कॉलम उल्लंघन हुए? – Learner

3

AFAIK, डुप्लिकेट कुंजी अपवाद को बताने का एकमात्र तरीका त्रुटि संदेश को पार्स करना है।

पहला स्थान डुप्लिकेट कुंजी अपवाद को रोकने के लिए एक बेहतर समाधान है। डालने लिखें नहीं डुप्लिकेट चाबी डालें, और @@rowcount साथ जांच करने के लिए अगर एक पंक्ति जोड़ दिया गया: सौभाग्य से

insert YourTable 
     (id, col1, col2) 
select 1, 'a', 'b' 
where not exists 
     (
     select * 
     from YourTable yt2 
     where yt2.id = 1 
     ) 

if @@rowcount = 0 
    -- Duplicate key! 
+0

प्रश्न डुप्लिकेट कुंजी का पता लगाने के तरीके के बारे में MSSQL और मोटी क्लाइंट (जो चीज़ @@ rowcount = 0) के बीच संचार के बारे में है। – Paul

+1

मैंने आपके शीर्षक को 'MSSQL' में केवल एक डुप्लिकेट कुंजी अपवाद को अवरुद्ध करने के लिए एक तरीका की आवश्यकता है क्योंकि आप केवल डुप्लिकेट कुंजी अपवादों की परवाह करते हैं। मुझे लगता है कि एंडोमर ने ऐसा किया था ताकि आप इस सवाल को फिर से लिखना चाहें। –

+0

ध्यान दें कि यदि आप 'YourTable' पर कोई समवर्ती पहुंच है तो आप लॉकिंग को सही तरीके से प्रबंधित करना चाहते हैं। यह संभव है कि किसी और ने तालिका में डुप्लिकेट मान डालने से पहले '@@ rowcount' शून्य वापस आ जाए; कोड जो मानता है कि उसे अगले ऑपरेशन के लिए लॉक किया गया टेबल ऐसा नहीं हो सकता है, और डुप्लिकेट पंक्ति के लिए त्रुटि उत्पन्न होगी जो जांचने के दौरान वहां नहीं था। – MikeB

2

, आप पाठ पार्स करने के लिए नहीं है। SqlException में Number संपत्ति है। ओबेरसर्व, किस नंबर को वापस किया जा रहा है और उस पर मेल खाता है। संख्या अच्छी तरह से परिभाषित हैं। आप सिस्टम कैटलॉग टेबल में से किसी एक को भी देख सकते हैं (नाम आसान नहीं है)।

यह सभी SqlException एस (उदाहरण के लिए) को पकड़ने के बजाय केवल एक बहुत ही विशिष्ट त्रुटि को पकड़ने का एक बहुत अच्छा विचार है।

+0

आपका उत्तर मेरे लिए अच्छा लगता है, लेकिन ... क्या मैं इस तरीके का पता लगा सकता हूं कि कौन से कॉलम उल्लंघन हुए? – Learner

+1

नहीं, दुर्भाग्य से संदेश को पार्स करने की आवश्यकता है। आम तौर पर मैं अनुशंसा करता हूं कि आप केवल ज्ञात-अच्छे डेटा डालने का प्रयास करें। डालने से पहले जांचें। खराब डेटा की प्रतिक्रिया के रूप में त्रुटियों को संभालना अक्सर सबसे अच्छी रणनीति नहीं है। कम नियंत्रण (जैसा कि आप यहां देख रहे हैं) और अपवाद बहुत धीमे हैं। यह पीछे की ओर भी महसूस करता है। – usr

+0

हां, "डालने से पहले जांचें" मेरे लिए भी सही लगता है। धन्यवाद, मैं वास्तव में इसकी सराहना करता हूं ... – Learner