2009-06-25 17 views
16

के साथ नाम से बाध्यकारी क्वेरी पैरामीटर मैं वर्तमान में ओरेकल (System.Data.OracleClient) के लिए Microsoft ADO.NET प्रदाता का उपयोग कर रहा हूं। मुझे पता है कि यह निश्चित रूप से सबसे अच्छा ओरेकल प्रदाता उपलब्ध नहीं है और यह will soon be deprecated है, मुझे इसके बजाय ओरेकल के ओडीपी.NET का उपयोग करना चाहिए। कारण मैं अभी भी एमएस प्रदाता का उपयोग करता हूं क्योंकि ओडीपी.नेट द्वारा पैरामीटर को बाध्य करता है, नाम से नहीं। जब आप किसी क्वेरी में कई पैरामीटर का उपयोग करते हैं तो यह वास्तव में एक पिटा हो सकता है, क्योंकि आपको उन्हें सही क्रम में जोड़ने के लिए सावधान रहना होगा, जो आसानी से बग का कारण बन सकता है। यह भी कष्टप्रद है जब आप एक ही क्वेरी में एक ही पैरामीटर कई बार उपयोग करते हैं, उदाहरण के लिए:ODP.NET

SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0 
ODP.NET के साथ

, मैं OracleCommand है, जो मुझे लगता है कि बेवकूफ है करने के लिए दो पैरामीटर जोड़ने के लिए है ...

ओडीपी.नेट की OracleCommand में उस डिफ़ॉल्ट व्यवहार को बदलने की संपत्ति है: BindByName। जब सत्य पर सेट किया जाता है, पैरामीटर नाम से बंधे होते हैं, जो मैं चाहता हूं। दुर्भाग्य से यह वास्तव में, मेरी मदद नहीं करता है:

  • यह डिफ़ॉल्ट
  • मैं लगभग स्पष्ट रूप से ठोस ADO.NET कक्षाओं का उपयोग कभी नहीं से गलत पर सेट है, मैं ADO.NET 2.0 अमूर्त परत का उपयोग करना पसंद (DbProviderFactory , DbConnection, DbCommand ...) किसी विशिष्ट आरडीबीएमएस को युग्मन को कम करने के लिए। तो मेरे पास BindByName संपत्ति तक पहुंच नहीं है, जब तक कि मैं स्पष्ट रूप से OracleCommand पर सभी लाभ या अमूर्तता को खो देता हूं।
  • एएसपी.NET SqlDataSource का उपयोग करते समय, मैं खुद को डीबी कॉमांड नहीं बनाता, इसलिए मुझे BindByName को सत्य पर सेट करने का मौका नहीं मिलता है (मैं इसे चुनने की घटना में कर सकता हूं, लेकिन यह वास्तव में दर्द है प्रत्येक SqlDataSource के लिए यह करें ...)

मुझे इस मुद्दे को कैसे संभालना है? क्या BindByNameByDefault कहीं और सेटिंग है? (मुझे ऐसा कुछ नहीं मिला, लेकिन मैंने इसे याद किया होगा ...)

+0

मैंने इस "फीचर" के कारण 3 घंटे बर्बाद कर दिया! – Grzenio

उत्तर

7

मुझे लगता है कि आप अपना खुद का प्रदाता बना सकते हैं जो आप उपयोग करना चाहते हैं डिफ़ॉल्ट का उपयोग करता है। आप odp.net से सभी वर्गों को विरासत में आसानी से उस प्रदाता को बना सकते हैं, बस BindByName जैसे कुछ गुणों को समायोजित करें।

डीबीप्रोवाइडरफैक्टरी सामान्य odp.net कक्षाओं के बजाय आपकी कक्षाएं बनाएगा।

+0

अच्छा विचार, धन्यवाद! मुझे लगता है कि मैं कोशिश करूँगा –

+2

ठीक है, यह व्यवहार्य लगता है, लेकिन बहुत सीधी नहीं है ... अधिकांश ओडीपी.नेट वर्गों को बंद कर दिया गया है, इसलिए मैं उन तरीकों को ओवरराइड करने के लिए उनसे प्राप्त नहीं कर सकता, और परावर्तक के अनुसार वहां कई जगहें हैं OracleCommand कन्स्ट्रक्टर स्पष्ट रूप से कहा जाता है ... वैसे भी, मैं किसी भी बेहतर समाधान के बारे में नहीं सोच सकता, इसलिए मैं आपका जवाब स्वीकार करता हूं। धन्यवाद ! –

1

ओरेकल के लिए Microsoft ADO .NET प्रदाता के विच्छेदन के लिए के रूप में:

  • मैं बजाय इसे प्रयोग ODP नेट पर जाना होगा, आपकी समस्या को इसके साथ कई मुद्दों का केवल एक ही जा रहा है। और जैसा कि यह जाता है, यह अभी भी .NET 4.0 में उपलब्ध होगा, हालांकि असमर्थित।
  • यदि ओरेकल इस प्रदाता को अनुपयोगी प्रस्तुत करने का प्रबंधन करता है, तो शायद मैं DataDirect ADO.NET Data Provider for Oracle या dotConnect for Oracle जैसे व्यावसायिक विकल्प के साथ जाऊंगा, जो पूरी तरह से एडीओ .NET ढांचे में एकीकृत हो। और वे पहले से ही एंटिटी फ्रेमवर्क का समर्थन करते हैं, (मुझे विश्वास है कि ओरेकल ने कहा ओडीपी .NET नहीं होगा)।

ओडीपी .NET ने पहले से ही अपना अधिकांश समय लिया है।

+0

आप शायद तीसरे पक्ष के प्रदाताओं के बारे में सही हैं, लेकिन वे स्वतंत्र नहीं हैं, इसलिए मुझे यकीन नहीं है कि मैं अपने नियोक्ता को उन्हें खरीदने के लिए मना कर सकता हूं ... हालांकि, इकाई फ्रेमवर्क समर्थन संतुलन में डालने का एक गंभीर तर्क है । मुझे समझ में नहीं आ रहा है कि क्यों ओरेकल इसे ओडीपी.NET में लागू नहीं करता है ... –

+0

मैं ओरेकल के लिए डॉटकनेक्ट की दृढ़ता से अनुशंसा करता हूं। यह आपके द्वारा भुगतान किए जाने वाले प्रत्येक डॉलर के लायक है। – Konamiman

+0

ओरेकल ने वास्तव में एंटीटी फ्रेमवर्क का समर्थन करना शुरू कर दिया है, वास्तव में ईएफ और लिंक समर्थन के साथ एक बीटा ओडीपी.net रिलीज है। – Tridus

4

संकेत और विरासत का उपयोग करें! यदि आप एक सार डेटाबेस डेटाबेस के माध्यम से डेटा का उपयोग कर रहे हैं, तो डाटाबेस कार्यान्वयन हैंडल पैरामीटर बाध्यकारी की आवश्यकता है।

public abstract class Database 
{ 
    private readonly DbProviderFactory factory; 

    protected Database(DbProviderFactory factory) 
    { 
     this.factory = factory; 
    } 

    public virtual DbCommand CreateCommand(String commandText) 
    { 
     return CreateCommand(CommandType.Text, commandText); 
    } 

    public virtual DbCommand CreateCommand(CommandType commandType, String commandText) 
    { 
     DbCommand command = factory.CreateCommand(); 
     command.CommandType = commandType; 
     command.Text = commandText; 
     return command; 
    } 

    public virtual void BindParametersByName(DbCommand command) 
    { 

    } 
} 

और एक Oracle विशिष्ट कार्यान्वयन कि डिफ़ॉल्ट आदेश निर्माण को ओवरराइड करता है या नाम से मानकों को बाध्य करने के लिए विकल्प प्रदान करता है बनाने के लिए चुनें।

public class OracleDatabase : Database 
{ 
    public OracleDatabase() 
     : base(OracleClientFactory.Instance) 
    { 

    } 

    public override DbCommand CreateCommand(CommandType commandType, String commandText) 
    { 
     DbCommand command = base.CreateCommand(commandType, commandText); 
     BindParametersByName(command); 
     return command; 
    } 

    public override void BindParametersByName(DbCommand command) 
    { 
     ((OracleCommand)command).BindByName = true; 
    } 
} 

कोड Enterprise Library में Data Access Application Block पर आधारित है।

+0

यह एक परियोजना के लिए मैंने जो किया है उसके समान ही है। ODP.DET डिफ़ॉल्ट कार्यान्वयन प्रदान करने वाली सुविधा विधियों को जोड़ने के लिए OracleDatabase क्लास भी एक अच्छा एक्सटेंशन बिंदु प्रदान करता है। – CodingWithSpike

+0

हालांकि यह समाधान सी # कोड में उपयोग के लिए बिल्कुल सही है, लेकिन यह एएसपी.NET SqlDataSource के मामले में मदद नहीं करता है: मुझे एक ADO.NET प्रदाता निर्दिष्ट करना है, कस्टम डेटा एक्सेस परत नहीं ... –

+0

@ थॉमस लेवेस्क मैं SqlDataSource से अपरिचित हूं, लेकिन ऐसा लगता है कि आप DataSourceControl से उत्तराधिकारी हो सकते हैं और अपना खुद का ओरेकलडेटा स्रोत ... फिर से मज़ेदार बना सकते हैं? –

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