2008-10-09 15 views
20

द्वारा सही डीबीकनेक्शन ऑब्जेक्ट को पुनर्प्राप्त करना मेरे पास एक फ़ंक्शन पर एक कनेक्शन स्ट्रिंग पास हो रही है, और मुझे इस स्ट्रिंग के आधार पर एक डीबीकनेक्शन आधारित ऑब्जेक्ट (यानी SQLConnection, OracleConnection, OLEDbConnection आदि) बनाने की आवश्यकता है।सी # कनेक्शन स्ट्रिंग

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

उत्तर

29
DbConnection GetConnection(string connStr) 
    { string providerName = null; 
     var csb = new DbConnectionStringBuilder{ConnectionString=connStr}; 

     if (csb.ContainsKey("provider")) 
     { providerName = csb["provider"].ToString(); 
     }   
     else 
     { var css = ConfigurationManager 
          .ConnectionStrings 
          .Cast<ConnectionStringSettings>() 
          .FirstOrDefault(x=>x.ConnectionString==connStr); 
     if (css != null) providerName = css.ProviderName; 
     } 

     if (providerName != null) 
     { var providerExists = DbProviderFactories 
            .GetFactoryClasses() 
            .Rows.Cast<DataRow>() 
            .Any(r=>r[2].Equals(providerName)); 
     if (providerExists) 
      { var factory = DbProviderFactories.GetFactory(providerName); 
      var dbConnection = factory.CreateConnection(); 

      dbConnection.ConnectionString = connStr; 
      return dbConnection; 
      } 
     } 

     return null; 
    } 
+0

मैं भी इसे पसंद OLEDB कनेक्शन स्ट्रिंग वाला काम है नहीं लगता है: प्रदाता = Microsoft.ACE.OLEDB.12.0; डेटा स्रोत = 9cb8a4c4-9661-4c10-a21c-fb4a85ce2471.xlsx; मोड = ReadWrite; विस्तारित गुण = "एक्सेल 12.0 एक्सएमएल; एचडीआर = हाँ; IMEX = 0;" –

+0

नहीं, अगर प्रदाता को "System.Data.OleDb" के रूप में निर्दिष्ट किया गया है या कॉन्फ़िगरेशन में कनेक्शन स्ट्रिंग निर्दिष्ट है, तो यह केवल एक OLEDB कनेक्शन लौटाएगा। –

+0

मुझे यह वाकई आश्चर्यजनक लगता है कि आप इस तरह की परेशानी के बिना अपना कोड डीबी-स्वतंत्र नहीं बना सकते हैं। –

1

के क्रमपरिवर्तन अप कोड करने के लिए नहीं आप प्रदाता अनुभाग की पार्स और यह DbProviderFactories.GetFactory में पारित जो एक OdbcFactory, OleDbFactory या SqlClientFactory वापस आ जाएगी और आप तो CreateConnection आदि

मुझे यकीन है कि यह कैसे जब तक Oracle के साथ काम करेगा नहीं कर रहा हूँ निष्पादित करने देने के लिए सक्षम होना चाहिए वे एक OracleDbFactory प्रदान करते हैं।

18

यदि आप फ्रेमवर्क 2.0 या ऊपर का उपयोग कर रहे हैं, और आप उन्हें ड्राइवर वर्ग के साथ दूसरी स्ट्रिंग में पास करने के लिए प्राप्त कर सकते हैं, तो आप अपने लिए ड्राइवर लोड करने के लिए dbProviderFactory क्लास का उपयोग कर सकते हैं। http://msdn.microsoft.com/en-us/library/wda6c36e.aspx

1

अधिकांश कनेक्शन तार (कम से कम .NET 2.0 में) भी एक ProviderName संपत्ति उनके साथ जुड़ी है:

DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(myDriverClass); 
DbConnection dbConnection = dbProviderFactory.CreateConnection(); 
dbConnection.ConnectionString = myConnectionString; 

यहाँ फैक्टरी वर्ग के लिए एक MSDN लिंक भी है। तो किसी SQL कनेक्शन स्ट्रिंग की तरह एक प्रदाता नाम होगा:

providerName="System.Data.SqlClient" 

तो अपने विधि और दोनों कनेक्शन स्ट्रिंग और प्रदाता नाम को स्वीकार करने की आवश्यकता होगी तो आप DbProviderFactory as mentioned by damieng इस्तेमाल कर सकते हैं।

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