2010-05-30 13 views
7

मैं अलग-अलग प्रदाताओं को लक्षित करने में सी # एसक्यूएल कथन लिखने का एक तरीका ढूंढ रहा हूं। एसक्यूएल स्टेटमेंट्स का अलग-अलग उदाहरण LIMIT in PostgreSQL बनाम TOP in MSSQL है।जेनेरिक एसक्यूएल बिल्डर .NET

उपरोक्त दोनों की तरह एसक्यूएल-सिंटैक्स को हल करने का एकमात्र तरीका यह है कि उपयोगकर्ता द्वारा कौन सा प्रदाता चुनता है या प्रवाह नियंत्रण के रूप में प्रयास कथन का उपयोग कर रहा है (LIMIT काम नहीं करता है, मैं शीर्ष कोशिश करूंगा इसके बजाय)? मैंने LINQ Take विधि देखी है, लेकिन मुझे आश्चर्य है कि कोई LINQ के बिना ऐसा कर सकता है?

दूसरे शब्दों में, सी # कुछ सामान्य एसक्यूएल प्रदाता वर्ग कि मुझे लगता है कि इस्तेमाल किया जा सकता खोजने में असफल रहा है है?

+1

आप LINQ का उपयोग क्यों नहीं करना चाहते हैं? –

+0

इन मतभेदों को हल करने के कई तरीके हैं, क्या आप निश्चित रूप से एसक्यूएल का उपयोग करने का तरीका हैं, यानी, कुछ सिस्टम ढूंढें जो आपको एक SQL कथन लिखने की अनुमति देता है जो विभिन्न प्रदाताओं में काम करेगा? –

+0

@ मार्क बिअर्स: ठीक है, मैं खुद को अक्सर .NET 2 को लक्षित करता हूं और जहां तक ​​मुझे पता है, LINQ वहां अच्छी तरह से काम नहीं करता है। ऐतिहासिक रूप से ऐसा इसलिए था क्योंकि मैं किसी भी फज़ के बिना मोनो को बंदरगाह करने में सक्षम होना चाहता था, और फिर मुझे बस "अटक गया" मिला। चूंकि मोनो आजकल LINQ के साथ अच्छी तरह से काम करता है, इसलिए मैं वास्तव में कोई अन्य अच्छा जवाब नहीं दे सकता हूं कि मैं अभी भी अतीत में क्यों रह रहा हूं .. – Patrick

उत्तर

7

इकाई की रूपरेखा अलग डेटाबेस को लक्ष्य करने में सक्षम है। यह आपको LINQ कथन लिखने की अनुमति देगा जो दोनों डेटाबेस के साथ काम करेगा। आपको इकाई फ्रेमवर्क के लिए पोस्टग्रेस्क्ल प्रदाता ढूंढना होगा। से चुनने के लिए कई हैं।

उम्मीद है कि इससे मदद मिलती है।

3

वहाँ DBLinq है: ओरेकल, PostgreSQL, MySQL, इन्ग्रेस, SQLite, Firebird और ... एसक्यूएल सर्वर के लिए

LINQ प्रदाता (सी # 3,0)

जब आप किसी क्वेरी का उपयोग कर उत्पन्न LINQ से SQL को जेनरेट किए गए SQL को देखना और इसे सहेजना संभव है।

हालांकि यह "LINQ का उपयोग किए बिना" आपकी आवश्यकता को पूरा नहीं करता। यदि आपके पास LINQ उपलब्ध है, तो इसका उपयोग क्यों न करें?

3

मुझे नहीं लगता कि एक "सामान्य एसक्यूएल प्रदाता" है।

हमारी दुकान में हम दोनों डीबी 2 समर्थन करने के लिए की जरूरत है और एसक्यूएल सर्वर तो हम मॉडल, डेटा एक्सेस और व्यापार तर्क कक्षाएं बनाने एक परत पैटर्न लागू करने के लिए चुना है। डेटा एक्सेस लेयर विभिन्न डीबीएमएस से कनेक्शन को संभालता है और उन्हें मॉडल तर्कों को वापस व्यापार तर्क में भेजता है। व्यापार तर्क और मॉडल कक्षाओं को पता नहीं है कि डेटा एक्सेस लेयर डेटा कहां प्राप्त करता है।

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

+0

ओच, मेरा पहला वोट वोट। एक स्पष्टीकरण की सराहना की जाएगी। धन्यवाद। –

+0

तो मूल रूप से, अपना खुद का कार्यान्वयन करें? :-) संग्रहित प्रक्रियाएं डेटाबेस के बीच एक "मानक" नहीं हैं, जहां तक ​​मुझे पता है, हालांकि एक अच्छा बिंदु है क्योंकि इससे व्यापार तर्क के साथ काम करते समय त्रुटियां कम हो सकती हैं। मैं एक डीबी में उदाहरण सूची तालिकाओं के लिए एक रास्ता तलाश रहा था और फिर "किसी भी डेटाबेस" में किसी विशेष तालिका से कॉलम प्राप्त कर रहा था, इस मामले में एसपी एक मैच के अच्छे नहीं हैं। – Patrick

+0

मैं देखता हूं, आपके प्रश्न ने डेटाबेस ऑब्जेक्ट्स को "खोजना" की आवश्यकता का विस्तार नहीं किया है, यह एसक्यूएल कार्यान्वयन में अंतर से परे है। स्पष्टीकरण के लिए धन्यवाद और मैं समझता हूं कि यह वह नहीं है जिसे आप ढूंढ रहे हैं और इस प्रकार नीचे वोट। –

1

मार्क टिड के विचार में शामिल होना - यदि आप लिंक नहीं चाहते हैं, तो प्रत्येक प्रदाता के लिए अलग डीएएल कक्षाएं बनाएं, या संग्रहीत प्रक्रियाओं का उपयोग करें जो प्रत्येक डीबी पर लागू किए जाएंगे।

+0

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

संबंधित मुद्दे