2012-01-23 5 views
5

हम सी # से SQL सर्वर से कनेक्ट करने के लिए मानक System.Data कक्षाओं, DbConnection और DbCommand का उपयोग करते हैं, और हमारे पास कई संग्रहीत प्रक्रियाएं हैं जो इनपुट के रूप में VARCHAR या NVARCHAR पैरामीटर लेती हैं। हमने पाया कि न तो SQL सर्वर और न ही हमारे सी # एप्लिकेशन किसी भी प्रकार की त्रुटि या चेतावनी फेंकता है जब पैरामीटर की अधिकतम लंबाई से अधिक स्ट्रिंग को उस पैरामीटर के मान के रूप में पास किया जाता है। इसके बजाए, मान को पैरामीटर की अधिकतम लंबाई तक चुपचाप छोटा कर दिया जाता है।मैं अपने संग्रहीत प्रक्रिया इनपुट को चुपचाप कटाई से कैसे रखूं?

तो, उदाहरण के लिए, यदि संग्रहीत प्रक्रिया इनपुट प्रकार VARCHAR(10) की है और हम 'U R PRETTY STUPID' में गुजरती हैं, संग्रहीत प्रक्रिया है जो बहुत अच्छा है, लेकिन हम क्या कहते हैं करने के लिए होती पूरी तरह से नहीं है 'U R PRETTY' के रूप में इनपुट, प्राप्त करता है।

क्या मैं इन truncations पता लगाने के लिए पूर्व में की गई है, और क्या others have likewise suggested, पैरामीटर इनपुट लंबाई एक चरित्र की आवश्यकता की तुलना में बड़ा बनाने के लिए, और उसके बाद जाँच लें कि इनपुट की लंबाई है कि नए अधिकतम लंबाई के बराबर है । तो उपर्युक्त उदाहरण में मेरा इनपुट VARCHAR(11) बन जाएगा और मैं लंबाई 11 के इनपुट की जांच करूंगा। 11 या उससे अधिक लंबाई के किसी भी इनपुट को इस चेक द्वारा पकड़ा जाएगा। यह काम करता है, लेकिन गलत लगता है। आदर्श रूप से, डेटा एक्सेस लेयर इन समस्याओं का स्वचालित रूप से पता लगाएगा।

क्या यह पता लगाने का एक बेहतर तरीका है कि प्रदत्त संग्रहीत प्रक्रिया इनपुट अनुमति से अधिक लंबा है? DbCommand पहले से ही इनपुट लंबाई सीमा से अवगत नहीं होना चाहिए?

इसके अलावा, जिज्ञासा के मामले में, चुपचाप हमारे इनपुट को कम करने के लिए ज़िम्मेदार क्या है?

+0

क्या आप चरित्र सीमा से छुटकारा पा सकते हैं और इसके बजाय एक जांच बाधा का उपयोग कर सकते हैं? –

+0

@ माइक क्रिस्टेनसेन - क्या आप इसका मतलब थोड़ा बढ़ा सकते हैं? हमारी टेबल पहले से ही सही डेटा प्रकार (और लंबाई), एफके, और 'जांच' बाधाओं के साथ उचित रूप से बाध्य हैं। इससे पहले कि मैं किसी भी संग्रहीत प्रक्रिया तर्क या प्रश्नों में उनका उपयोग करने से पहले अति-सीमा इनपुट का पता लगा रहा हूं। –

+0

ओह, मैं क्षमा चाहता हूं, मैं सोच रहा था कि आप सीधे एक टेबल में डालने वाले थे। आप स्पोक पैरामीटर के बारे में बात कर रहे हैं। क्या आप इसे 'वर्चर (MAX)' बना सकते हैं और फिर स्पोक में लंबाई की जांच कर सकते हैं? –

उत्तर

3

सभी चर और पैरामीटर के लिए VARCHAR(8000), NVARCHAR(4000) या N/VARCHAR(MAX) का उपयोग करें। इस तरह आपको @ variables और @parameters असाइन करते समय छंटनी के बारे में चिंता करने की आवश्यकता नहीं है। ट्रंकेशन वास्तविक डेटा लिखने (सम्मिलित या अपडेट) पर हो सकता है लेकिन यह चुप नहीं है, एक कठिन त्रुटि ट्रिगर करने जा रहा है और आपको इसके बारे में पता चल जाएगा। आपको संग्रहित प्रक्रिया कोड का अतिरिक्त लाभ भी मिलता है जिसे स्कीमा परिवर्तनों के साथ बदला नहीं जा रहा है (कॉलम की लंबाई बदलें, कोड अभी भी मान्य है)। और आप लगातार पैरामीटर लंबाई का उपयोग करने से बेहतर योजना कैश व्यवहार भी प्राप्त करते हैं, How Data Access Code Affects Database Performance देखें।

ध्यान रखें कि @ चर/@ पैरामीटर के लिए MAX प्रकारों का उपयोग करने के लिए थोड़ा सा प्रदर्शन मारा गया है, Performance comparison of varchar(max) vs. varchar(N) देखें।