2016-07-04 47 views
-1

我有一個app.config文件,它具有用於我的數據庫的連接字符串。 我想要做的是連接到這就是爲什麼我使用這個代碼不同的數據庫:在運行時更改連接字符串MySql C#

connectionString = "Data Source=blah;Initial Catalog=blah;UID=blah;password=blah"; 
     var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); 
     connectionStringsSection.ConnectionStrings[nameofConnectionString].ConnectionString = connectionString; 
     config.Save(); 
     ConfigurationManager.RefreshSection(nameofConnectionString); 

它工作得很好,它改變了連接字符串,但問題是,它向我發送一個錯誤說「facerec6 .0.cdcol不存在」

我的默認初始目錄= facerec6.0

我會做什麼?使用RefreshSection

<connectionStrings> <- this is the section 
    <add name="facerec6.0"/> <- this is the element 
    <add ... /> 
</connectionStrings> 

需要刷新的部分,而不是元素:

回答

0

ConnectionStringSection只是一個存儲命名連接字符串的容器。如果你想連接到不同的數據庫,那麼最好從一開始就將這些不同的連接字符串從一開始就存儲在該部分中,然後確定應用程序將如何選擇在運行時使用哪一個。

認爲該部分就是這樣,而不是其他 - 這是一個方便的,已知的地方用標準的方式來存儲連接字符串來檢索它們。其他開發代碼的開發人員將知道在哪裏查找它們並知道如何檢索它們。

儘管在技術上可以在運行時修改該部分並保存文件,但我不會這麼做。如果你有相同的代碼,可能在同一個環境中運行時使用不同的連接字符串(這不是開發中的一種,QA中的一種和生產中的一種),那麼你可以讓你的類依賴於類似這樣的接口:

public interface IConnectionStringFactory 
{ 
    string GetConnectionString(Something key); 
} 

Something是一個值,它需要連接字符串的類可以傳遞到工廠,工廠可以用它來確定要檢索的連接字符串。這樣,使用連接字符串的類就與該邏輯隔離了。它不知道爲什麼它使用一個或另一個連接字符串。它只是從工廠獲取連接字符串,然後使用它。

如果這是一個環境變化的連接字符串的情況下,那很容易 - 你可以用config transforms來做到這一點。在大多數情況下,如果它是不同的環境,那麼全部連接字符串對於每個環境都會有所不同,因此您可以只替換整個部分。

<connectionStrings xdt:Transform="Replace"> 
    <add name="connectionStringA" connectionString="...whatever..." /> 
</connectionStrings> 
+0

如果這是答案,請不要忘記標記爲已回答。謝謝 –

0

請改爲嘗試這個辦法:

ConfigurationManager.RefreshSection("connectionStrings"); 

因。

+0

我已經做了你說的,但它給了我一個例外「table」facerec6.0.cdcol不存在'「 – rillakkuma

+0

我認爲這是一個不同的錯誤。你可以檢查在配置文件的連接字符串部分是否存在''facerec6.0.cdcol'? – KaeL

相關問題