एमएस एसक्यूएल सर्वर से सी # में डेटा क्वेरी करने के लिए सबसे अच्छा अभ्यास?


9

C # में MS SQL Server से डेटा क्वेरी करने का सबसे अच्छा तरीका क्या है?

मुझे पता है कि कोड में SQL क्वेरी होना अच्छा अभ्यास नहीं है।

क्या एक संग्रहीत प्रक्रिया बनाने और इसे C # से पैरामीटर के साथ कॉल करने का सबसे अच्छा तरीका है?

using (var conn = new SqlConnection(connStr))
using (var command = new SqlCommand("StoredProc", conn) { CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
   conn.Close();
}

8
"मुझे पता है कि कोड में एसक्यूएल क्वेरी होना अच्छा नहीं है।" - imo, यह बकवास है।
ग्रैंडमास्टरबी

4
यदि आपने इसे एक ब्लॉक में बनाया है, तो आपको con.Close () को कॉल करने की आवश्यकता नहीं है। उपयोग करने वाले ब्लॉक का पूरा बिंदु विनाशकारी के सी ++ शैली की नकल करना है। अधिक सभ्य उम्र से एक सुंदर सफाई। ट्रेंडी कैच स्टाइल के रूप में यादृच्छिक या अनाड़ी नहीं।
लॉर्ड टाइडस

2
FYI करें। संग्रहीत प्रक्रियाएं "कोड" भी हैं। संग्रहीत प्रोकोस का पूरा बिंदु सेट-आधारित शैली एसक्यूएल के साथ प्रक्रियात्मक कोड को मिश्रण करने की अनुमति देना था। इसलिए आपके पास कोड की परवाह किए बिना एक क्वेरी होगी। बेहद उच्च मात्रा वाले ऐप्स के लिए कभी-कभी सर्वर को जोड़कर क्षैतिज स्केलिंग की अनुमति देने के लिए डेटाबेस के बाहर प्रदर्शन करना बेहतर होता है। यदि आप एकल DB को बनाए रख सकते हैं, लेकिन तर्क के लिए मूली-सर्वर तो स्केलिंग बहुत आसान हो जाती है।
लॉर्ड टाइडस

@GrandmasterB में हमारे पास C # में पर्याप्त मात्रा में SQL इनलाइन है (हमारा C # LOC अब 2 मिलियन के पास है) - और 6 साल बाद यह हमें काटने आ रहा है क्योंकि हमें अब उस इनलाइन SQL का शिकार करने की जरूरत है (हमने हाल ही में एक SQL विशेषज्ञ को काम पर रखा है। - इसलिए हम प्रदर्शन ट्विस्ट कर रहे हैं)। मेरा विश्वास करो: आप कभी नहीं जानते कि आपका ऐप कितना बड़ा हो जाएगा और भविष्य में चीजें कैसे बदल जाएंगी। अलग-अलग भाषाओं को अलग-अलग फाइलों में रखें - भले ही आप इसे संसाधनों को प्रकट करने के लिए बंद कर दें। आप यह भी कर सकते हैं // SQLCODE- लेकिन आपको ऐसा करने के लिए याद रखने की आवश्यकता है।
जोनाथन डिकिंसन

1
@JonathanDickinson, यदि आप चाहते हैं, तो संग्रहीत प्रोक्स का उपयोग करें। मैंने कहा है कि कई बार वे उपयोगी होते हैं जब आपके पास समान डेटाबेस के विरुद्ध कोड आधारों का संचालन होता है। लेकिन सिर्फ इसलिए कि वे कुछ परिस्थितियों में उपयोगी होते हैं स्वचालित रूप से हर समय उन्हें 'खराब अभ्यास' का उपयोग नहीं करते हैं । यदि एसक्यूएल स्टेटमेंट का उपयोग सीधे समस्या पैदा कर रहा है, तो यह उस ऐप के लिए 'बुरा अभ्यास' नहीं है।
ग्रैंडमास्टरबी

जवाबों:


10

संग्रहीत प्रक्रियाओं का उपयोग करना एक तरीका है, और कई वर्षों से व्यापक उपयोग में है।

C # (या किसी भी .NET भाषा) से SQL सर्वर डेटाबेस के साथ बातचीत करने का एक और आधुनिक तरीका एंटिटी फ्रेमवर्क का उपयोग करना है। एंटिटी फ्रेमवर्क का लाभ यह है कि यह उच्च स्तर की अमूर्तता प्रदान करता है।

Microsoft से उद्धृत करने के लिए ( https://msdn.microsoft.com/en-us/data/jj590134 ):

ADO.NET एंटिटी फ्रेमवर्क डेवलपर्स को सीधे रिलेशनल स्पेसिफिक स्कीमा के खिलाफ प्रोग्रामिंग के बजाय एक वैचारिक एप्लिकेशन मॉडल के खिलाफ प्रोग्रामिंग द्वारा डेटा एक्सेस एप्लिकेशन बनाने में सक्षम बनाता है। लक्ष्य डेटा-उन्मुख अनुप्रयोगों के लिए आवश्यक कोड और रखरखाव की मात्रा को कम करना है। इकाई फ्रेमवर्क अनुप्रयोग निम्नलिखित लाभ प्रदान करते हैं:

  • एप्लिकेशन अधिक अनुप्रयोग-केंद्रित वैचारिक मॉडल के संदर्भ में काम कर सकते हैं, जिसमें विरासत, जटिल सदस्यों और रिश्तों के साथ प्रकार शामिल हैं।
  • अनुप्रयोगों को एक विशेष डेटा इंजन या स्टोरेज स्कीमा पर हार्ड-कोडित निर्भरता से मुक्त किया जाता है।
  • वैचारिक मॉडल और स्टोरेज-विशिष्ट स्कीमा के बीच मैपिंग एप्लिकेशन कोड को बदले बिना बदल सकती है।
  • डेवलपर्स एक सुसंगत एप्लिकेशन ऑब्जेक्ट मॉडल के साथ काम कर सकते हैं जिसे विभिन्न स्टोरेज स्कीमाओं में मैप किया जा सकता है, संभवतः विभिन्न डेटाबेस प्रबंधन प्रणालियों में लागू किया जाता है।
  • एकाधिक वैचारिक मॉडल को एकल संग्रहण स्कीमा में मैप किया जा सकता है।
  • भाषा-एकीकृत क्वेरी (LINQ) समर्थन एक वैचारिक मॉडल के खिलाफ प्रश्नों के लिए संकलन-समय सिंटैक्स सत्यापन प्रदान करता है।

ORM बनाम संग्रहीत कार्यविधियों के उपयोग में विशेष रूप से सुरक्षा की दृष्टि से ट्रेडऑफ़ शामिल हैं और जहां तर्क रहता है।

SQL सर्वर के साथ विकास के लिए "क्लासिक" दृष्टिकोण है संग्रहीत तर्क प्रक्रियाओं और प्रोग्राम में रहते हैं तर्क केवल संग्रहीत प्रक्रियाओं को निष्पादित करने के लिए सुरक्षा अधिकार दिए गए हैं, तालिकाओं को सीधे अपडेट नहीं करते हैं। यहाँ अवधारणा यह है कि संग्रहीत कार्यविधियाँ अनुप्रयोग के लिए व्यावसायिक तर्क परत हैं। जबकि सिद्धांत ध्वनि है, यह विभिन्न कारणों से पक्ष से बाहर हो गया है, इसे C # या VB जैसी प्रोग्रामिंग भाषा में व्यावसायिक तर्क को लागू करने के द्वारा प्रतिस्थापित किया जा रहा है। अच्छे अनुप्रयोगों को अभी भी एक थकाऊ दृष्टिकोण के साथ लागू किया जाता है, जिसमें चिंताओं को अलग करना आदि शामिल हैं लेकिन एमवीसी जैसे पैटर्न का पालन करने की अधिक संभावना है।

डेटाबेस के बजाय ORM में तर्क को लागू करने के एक नकारात्मक डेटाबेस (DA या DBA) के लिए जिम्मेदार लोगों द्वारा डेटा अखंडता नियमों को डीबग करना और परीक्षण करना आसान है। अपनी चेकिंग से बचत खाते में धन हस्तांतरित करने का क्लासिक उदाहरण लें, यह महत्वपूर्ण है कि इसे एक परमाणु इकाई के रूप में किया जाए, दूसरे शब्दों में लेनदेन में। यदि इस प्रकार का स्थानांतरण केवल एक संग्रहीत प्रक्रिया के माध्यम से करने की अनुमति है, तो यह डीए और लेखा परीक्षकों के लिए संग्रहीत कार्यविधि के लिए अपेक्षाकृत आसान है।

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


या अन्य ओ.आर.एम. EF के साथ तुलना करने पर उनमें से कई फायदे और नुकसान के साथ हैं।
svick

8
ओआरएम के नुकसान को सूचीबद्ध करने से यह उत्तर अधिक उपयोगी होगा।
डेन

6

वास्तव में मूल दावा बहस का मुद्दा है - कोड में SQL होने या डेटाबेस में कोड होने के बीच या तो ट्रेड-ऑफ्स हैं (जो कि जहां आप संग्रहीत प्रक्रियाओं के साथ जा रहे हैं)।

जिसका मुख्य कारण यह है कि कोई एकल "सर्वश्रेष्ठ" नहीं है, यह ऐसा कुछ नहीं है जिसे आप सामान्यीकृत कर सकते हैं क्योंकि आप जिस भी रास्ते पर जाते हैं आप समझौता कर रहे हैं (आप लाभ प्राप्त करते हैं लेकिन बाधाओं का भी परिचय देते हैं)।

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

आर्किटेक्चर के बारे में चिंता करना आपके आवेदन के लिए अधिक महत्वपूर्ण है - एक उचित डेटा एक्सेस लेयर दिया गया है, चाहे एक ORM जैसे कि Entity Framework या NHibernate का उपयोग करना या कुछ और प्रत्यक्ष करना, इस निर्णय से आपके अधिकांश एप्लिकेशन को अलग-अलग करना चाहिए, भले ही आप प्रश्न बनाएं या संग्रहीत प्रक्रियाओं का उपयोग करें।


मैं स्वतंत्र रूप से छोटी टीमों (1-3 देवों) के साथ अपेक्षाकृत छोटी परियोजनाओं पर काम करने के लिए तैयार हूं - संग्रहीत प्रक्रियाओं का उपयोग करना, मेरे लिए, इसके मूल्य से अधिक परेशानी है क्योंकि हमारे अनुप्रयोगों (और मेरे कौशल?) की प्रकृति को देखते हुए नई तैनाती करना स्कीमा को अपडेट करने की तुलना में कोड आमतौर पर बहुत आसान है (यहां तक ​​कि यह भी अनुमति है कि मेरे पास कोड है जो स्कीमा को अपेक्षाकृत सरल बनाता है) और मैं सामान्य डेटा एक्सेस कोड के उपयोग से व्यावसायिक नियमों को लागू करने में सक्षम हूं। यह स्पष्ट रूप से "आपका माइलेज मई वैरी" का एक उत्कृष्ट उदाहरण है।


2
+1 "नो बेस्ट बेस्ट" के लिए, -1 कोड की तैनाती के लिए संग्रहीत खरीद परिवर्तन को लागू करने से आसान है, +1 एक ऐसा दृष्टिकोण चुनने के लिए जो आपके ऐप के लिए समझ में आता है और DAL अलगाव सुनिश्चित करता है - So +1।
जोएल ब्राउन

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

+1, whats सबसे अच्छा अनुप्रयोग और स्थिति पर निर्भर करता है।
ग्रैंडमास्टरबी

1
मुझे लगता है कि यह उन परिस्थितियों पर निर्भर करता है, जिनमें आप काम करते हैं। यदि आपके पास डीबीए नहीं है तो आपको उत्पादन से बाहर कर देना चाहिए, डेटाबेस में स्टोर किए गए प्रतिस्थापन को खरीदना आसान हो सकता है। उस मामले के लिए, उत्पादन नियंत्रण के बिना नए मार्कअप, स्क्रिप्ट और यहां तक ​​कि नए संकलित कोड को एक केंद्रीकृत ऐप में छोड़ने से भी बहुत आसान हो सकता है।
जोएल ब्राउन

@JoelBrown - बिल्कुल - मुझे लगता है, नहीं, मुझे यकीन है कि मैंने वहाँ धारणाओं की एक पूरी गांठ बना ली है। सबसे पहले मेरा स्कीमा संस्करण नियंत्रित होता है (एक क्रूड लेकिन प्रभावी फैशन में), मैं कोई डीबीए नहीं हूं, लेकिन मैं यह जानने के लिए पर्याप्त स्मार्ट हूं कि किसी के स्कीमा के अनुरूप होना चाहिए। मैं ज्यादातर वेब ऐप्स पर काम करता हूं और आप सर्वर पर जाकर डेटाबेस को प्राप्त नहीं कर सकते हैं, जबकि मेरे पास (सिर्फ) एक ही बटन पर एप्लिकेशन की तैनाती कम (कम या ज्यादा) है ... क्लिक करके स्कीमा अपडेट को कहा तैनाती सूची में है, लेकिन मुझे हमेशा कोड अपडेट (रोलबैक में आसानी) से अधिक तनावपूर्ण अपडेट मिला है
मर्फ़

4

जब तक आप अपने इनपुट को अपंग करते हैं, तब तक कोई भी दृष्टिकोण मान्य होता है। कोड के तर्कों में से अधिकांश में बुरे दिनों से संबंधित प्रश्न नहीं हैं जब कई पुस्तकालयों ने आपको अपने बयानों को एक साथ स्ट्रिंग करने के लिए मजबूर किया और यही वह जगह है जहां से sql इंजेक्शन के हमले आए थे।


1
क्या पैरामीटरिंग पर्याप्त है? क्या आपको स्वच्छता की आवश्यकता नहीं है?
स्टुपरयूजर

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

0

सबसे अच्छा अभ्यास वास्तव में यहाँ ओवरब्लॉब किया गया है - इसे करने के लिए बहुत सारे अच्छे तरीके हैं और जिसे आप चुनते हैं वह वास्तव में इस बात पर निर्भर होना चाहिए कि आपका ऐप क्या है और आपको क्या करने की आवश्यकता है। उस ने कहा, केवल दो चीजें हैं जो आप वास्तव में गलत कर सकते हैं:

  • जैसा कि @Bill बताता है, आपको हमेशा अपने प्रश्नों का पैरामीटर बनाना चाहिए। स्ट्रिंग बिल्डिंग बग्स को ट्रैक करने के लिए SQL इंजेक्शन के साथ-साथ हार्ड के सभी तरीकों के लिए एक आसान वेक्टर है। बहुत चालाक लोगों को यह पता लगाने की जरूरत है कि एसक्यूएल को ट्यूपलाइज और बचाना है तो आपको इसे खुद निकालने की जरूरत नहीं है।

  • अपने कनेक्शन बंद करें। सबसे अच्छा तरीका है कि सब कुछ एक बयान का उपयोग कर लपेटो, लेकिन कोशिश करो / पकड़ / अंत में बहुत अच्छा है कि अगर आपकी नाव तैरती है। लेकिन हमेशा सुनिश्चित करें कि आप एक सस्ती कार की तरह एक कनेक्शन का उपयोग करते हैं - इसे कठिन और तेज ड्राइव करें और इसे जल्दी से छुटकारा पाएं।

दूसरी प्रथा मैं इसके लिए जोरदार तर्क दूंगा कि आप अपने डेटा एक्सेस कोड को यथासंभव कम से कम स्थानों पर केंद्रित करना सुनिश्चित करें। हम इस कैविटी को लागू करने में मदद करने के लिए System.Data.SqlClient का सीधा संदर्भ रखने के लिए फ्रंट-एंड वेब ऐप्स को अनुमति नहीं देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.