2016-07-04 5 views
-1

Ich habe eine app.config-Datei, die eine Verbindungszeichenfolge für meine Datenbank hat. , was ich tun möchte, ist auf verschiedene Datenbanken zu verbinden, deshalb habe ich an diesem Code verwendet:Ändern Verbindungszeichenfolge zur Laufzeit 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); 

es gut funktioniert, verändert es die Verbindungszeichenfolge, aber das Problem ist, dass es mir ein Fehler sendet sagen „facerec6 .0.cdcol existiert nicht“

mein Standard-Anfangskatalog = facerec6.0

, was ich tun?

Antwort

0

Die ConnectionStringSection ist nur ein Container zum Speichern von benannten Verbindungszeichenfolgen. Wenn Sie eine Verbindung zu verschiedenen Datenbanken herstellen möchten, empfiehlt es sich, zunächst die verschiedenen Verbindungszeichenfolgen in diesem Abschnitt von Anfang an zu speichern und anschließend festzulegen, wie Ihre Anwendung zur Laufzeit auswählen soll.

Denken Sie an diesen Abschnitt als nur das und nichts mehr - es ist ein bequemer, bekannter Ort, um Verbindungszeichenfolgen mit einer Standardmethode zu speichern, um sie abzurufen. Andere Entwickler, die an dem Code arbeiten, werden wissen, wo sie nach ihnen suchen und wie sie sie abrufen können.

Obwohl es technisch möglich ist, diesen Abschnitt zur Laufzeit zu ändern und die Datei zu speichern, würde ich das nicht tun. Wenn Sie denselben Code verwenden, der während der Ausführung in derselben Umgebung verschiedene Verbindungszeichenfolgen verwenden kann (es handelt sich nicht um einen für die Entwicklung, einen für die Qualitätssicherung und einen für die Produktion), könnte Ihre Klasse von einer solchen Schnittstelle abhängig sein :

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

Wo Something ist ein Wert, dass die Klasse die Verbindungszeichenfolge erfordert in die Fabrik passieren kann, und die Fabrik kann es verwenden, um die Verbindungszeichenfolge abzurufen zu bestimmen. Auf diese Weise ist die Klasse, die die Verbindungszeichenfolge verwendet, von dieser Logik isoliert. Es weiß nicht, warum es eine Verbindungszeichenfolge oder eine andere verwendet. Es erhält nur eine Verbindungszeichenfolge von der Fabrik und verwendet sie dann.

Wenn es sich um unterschiedliche Verbindungszeichenfolgen nach Umgebung handelt, ist das viel einfacher - Sie können das mit config transforms tun. In den meisten Fällen, wenn es eine andere Umgebung ist als alle werden die Verbindungszeichenfolgen für jede Umgebung unterschiedlich sein, so dass Sie nur den gesamten Abschnitt ersetzen können.

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

Wenn das die Antwort ist, bitte vergessen Sie nicht, es als beantwortet zu markieren. Vielen Dank –

0

Bitte versuchen Sie stattdessen:

ConfigurationManager.RefreshSection("connectionStrings"); 

weil:

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

Sie müssen den Abschnitt aktualisieren, nicht das Element, wenn RefreshSection verwenden.

+0

i schon tat, was Sie sagen, aber es gibt mir eine Ausnahme – rillakkuma

+0

„Tabelle‚facerec6.0.cdcol nicht existiert‘“ Ich denke, das ist eine andere Fehler. Können Sie überprüfen, ob '' faretrec6.0.cdcol 'im Abschnitt der Verbindungszeichenfolge Ihrer Konfigurationsdatei vorhanden ist? – KaeL