2008-12-11 8 views
56

मैं किसी भी कॉन्फ़िगरेशन फ़ाइलों/रजिस्ट्री कुंजियों में बिल्कुल कोई बदलाव नहीं होने के साथ प्रोग्राम कनेक्शन को प्रोग्रामेटिक रूप से सेट करना चाहता हूं।मैं .NET में प्रोग्राम स्ट्रैटिक रूप से कनेक्शन स्ट्रिंग कॉन्फ़िगर कैसे सेट करूं?

मेरे पास कोड का यह टुकड़ा है, लेकिन दुर्भाग्य से यह "कॉन्फ़िगरेशन केवल पढ़ने के लिए" अपवाद फेंकता है।

ConfigurationManager.ConnectionStrings.Clear(); 
string connectionString = "Server=myserver;Port=8080;Database=my_db;..."; 
ConnectionStringSettings connectionStringSettings = 
    new ConnectionStringSettings("MyConnectionStringKey", connectionString); 
ConfigurationManager.ConnectionStrings.Add(connectionStringSettings); 

संपादित करें: समस्या है कि मैं कोड है कि विन्यास से कनेक्शन स्ट्रिंग पढ़ता मौजूदा है। तो मैन्युअल रूप से कॉन्फ़िगरेशन स्ट्रिंग को सेट करना, या किसी संसाधन के माध्यम से, वैध विकल्प की तरह प्रतीत नहीं होता है। मुझे वास्तव में आवश्यकता है विन्यास रूप से विन्यास को संशोधित करने का एक तरीका है।

+0

आप विन्यास फाइल में कनेक्शन स्ट्रिंग को बदलने के लिए करना चाहते हैं? आपके द्वारा बनाए गए किसी भी कनेक्शन स्ट्रिंग के साथ गतिशील रूप से नया कनेक्शन बनाना आसान है ... यदि आप यही करना चाहते हैं ... लेकिन यदि आप वास्तविक कॉन्फ़िगरेशन फ़ाइल में लिखना चाहते हैं, तो यह एक अलग मुद्दा है। –

उत्तर

105

मैंने इस बारे में post on my blog में लिखा है। चाल गैर-सार्वजनिक क्षेत्रों (और विधियों) तक पहुंच प्राप्त करने के तरीके के रूप में मूल्यों को पोक करने के प्रतिबिंब का उपयोग करना है।

उदाहरण के लिए।

var settings = ConfigurationManager.ConnectionStrings[ 0 ]; 

var fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

fi.SetValue(settings, false); 

settings.ConnectionString = "Data Source=Something"; 
+1

यदि आप NHibernate का उपयोग कर रहे हैं, तो यह http://nhforge.org/wikis/howtonh/dynamically-change-user-info-in-connection-string.aspx –

+1

धन्यवाद @ डेविड देखें। महान एवर, बहुत मददगार! –

+6

ग्रेट समाधान! यदि आप एक नया कनेक्शन स्ट्रिंग जोड़ना चाहते हैं, तो कनेक्शनस्ट्रिंग संग्रह में जोड़ने को सक्षम करने के लिए निम्न का उपयोग करें: 'टाइपऑफ (कॉन्फ़िगरेशन एलिमेंट कोलेक्शन)। गेटफ़िल्ल्ड ("बीआरएडऑनली", बाइंडिंगफ्लैग्स.इंस्टेंस | बाइंडिंगफ्लैग .ऑनपब्लिक) .सेटवैल्यू (कॉन्फ़िगरेशन मैनेजर.कनेक्शनस्ट्रिंग्स, झूठी) ; ' –

1

आप इसे इसके बजाय संसाधन फ़ाइल में डाल सकते हैं। इसमें कॉन्फ़िगरेशन प्रबंधक श्रेणी की अंतर्निहित सुविधाएं नहीं होंगी, लेकिन यह काम करेगी।

Resources.resx मान लिया जाये:

Resources.Default.ConnectionString = "Server=myserver;" // etc

फिर अपने कोड में

:

conn.ConnectionString = Resources.Default.ConnectionString

यह एक हैक है, मुझे पता है।

-1

कॉन्फ़िगरेशन प्रबंधक को पर कॉन्फ़िगरेशन फ़ाइल से पढ़ने के लिए उपयोग किया जाता है।

आपका समाधान केवल conn.ConnectionString को कॉन स्ट्रिंग के लिए सेट करना है।

+3

यह वास्तव में काम नहीं करता है - आपको अपवाद मिलता है। – ripper234

5

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

मैं इसे देव बनाम प्रोड के लिए एक और कार्यान्वयन में बढ़ा सकता हूं लेकिन मैं अपने उत्पादन असेंबली में आईसीनेक्शन स्ट्रिंग फैक्ट्री का एक कार्यान्वयन और मेरी परीक्षण असेंबली में परीक्षण कार्यान्वयन के साथ अधिक आरामदायक हूं।

0

दिए गए अन्य उत्तरों के अलावा, और कनेक्शन स्ट्रिंग को मानना ​​एक और कॉन्फ़िगरेशन चर या पूरी तरह से स्थिर नहीं है, तो आप स्ट्रिंग को सीधे संयोजित करने के बजाय SqlConnectionStringBuilder कक्षा का उपयोग करने पर विचार कर सकते हैं।

संपादित करें: ऊपर, खेद है कि आपने देखा है कि आप मूल रूप से किसी अन्य स्रोत से अपनी कनेक्शन स्ट्रिंग (पूर्ण अनुमान) को पढ़ना चाहते हैं।

6

मुझे लगता है कि यह मेरे लिए काम करता है:

Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
ConnectionStringsSection section = config.GetSection("connectionStrings") as   ConnectionStringsSection; 
if (section != null) 
{ 
    section.ConnectionStrings["MyConnectionString"].ConnectionString = connectionString; 
    config.Save(); 
} 

यह कोई मौजूदा कनेक्शन स्ट्रिंग अधिलेखित कर देता है।

+3

web.config फ़ाइल को बदलने के साथ सावधान रहें क्योंकि यह कार्यकर्ता को पुनरारंभ करने का कारण बनता है। मैंने कनेक्शनस्टार्ट इवेंट में फ़ाइल आधारित डेटाबेस में कनेक्शनस्ट्रिंग सेट करने का प्रयास किया जिसके कारण प्रत्येक विज़िट किए गए पृष्ठ के लिए एप्लिकेशन पुनरारंभ होता है ... – Thomas

+0

दरअसल। मैंने इसे साझा होस्टिंग खाते पर web.config को एन्क्रिप्ट और डिक्रिप्ट करने के लिए एक व्यवस्थापकीय टूल फ़ंक्शन के रूप में उपयोग किया। जैसा कि थॉमस ने इंगित किया है, आप इसे सत्र या आवेदन शुरू करने के हिस्से के रूप में नहीं करना चाहते हैं। – Junto

+1

+1: यह मेरे उद्देश्यों के लिए एकदम सही है (एकीकरण परीक्षण)। हालांकि, क्योंकि मेरा उत्पादन कोड 'कॉन्फ़िगरेशन प्रबंधक' का उपयोग करता है, मुझे 'ConfigurationManager.RefreshSection ("कनेक्शनस्ट्रिंग्स") करना है;' एक बार मैंने अपने परीक्षण में सेक्शन को अपडेट कर लिया है। –

8

मैं स्थानीय SQL सर्वर का चयन करके एक बार क्लिक में कनेक्शन स्ट्रिंग में संशोधन करने की अनुमति देने के बारे में उसी qustion के उत्तर की तलाश कर रहा था।

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

string NewConnection = ""; 
// get the user to supply connection details 
frmSetSQLConnection frm = new frmSetSQLConnection(); 
frm.ShowDialog(); 
if (frm.DialogResult == DialogResult.OK) 
{ 
    // here we set the users connection string for the database 
    // Get the application configuration file. 
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
    // Get the connection strings section. 
    ConnectionStringsSection csSection = config.ConnectionStrings; 
    foreach (ConnectionStringSettings connection3 in csSection.ConnectionStrings) 
    { 
     // Here we check for the preset string - this could be done by item no as well 
     if (connection3.ConnectionString == "Data Source=SQL204\\SQL2008;Initial Catalog=Transition;Integrated Security=True") 
     { 
      // amend the details and save 
      connection3.ConnectionString = frm.Connection; 
      NewConnection = frm.Connection; 
      break; 
     } 
    } 
    config.Save(ConfigurationSaveMode.Modified); 
    // reload the config file so the new values are available 

    ConfigurationManager.RefreshSection(csSection.SectionInformation.Name); 

    return clsDBMaintenance.UpdateDatabase(NewConnection)) 
} 
+0

एफवाईआई, यह आपके ऐप डोमेन को फिर से लोड करने का कारण बनता है, इसलिए कम से कम उपयोग करें – yano

7

एक और तरीका है इस दृष्टिकोण के लिए सीधे संग्रह पर संचालित करने के लिए होगा:

var settings = ConfigurationManager.ConnectionStrings; 
var element = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 

element.SetValue(settings, false); 
collection.SetValue(settings, false); 

settings.Add(new ConnectionStringSettings("ConnectionStringName", connectionString)); 

// Repeat above line as necessary 

collection.SetValue(settings, true); 
element.SetValue(settings, true); 
संबंधित मुद्दे