0

Ich habe ein Stück Code (.NET Framework 4.5.2, Enterprise Library 5.0.505.0), zu dem ich eine Verbindung herstellen muss eine SQL Server-Datenbank. Der DB-Name ändert sich jedoch möglicherweise je nach Anforderung des Benutzers. Also habe ich den folgenden Code, um die Verbindungszeichenfolge dynamisch in die Datei app.config zu schreiben.Aktivierungsfehler beim Versuch, Instanz vom Typ Datenbank zu erhalten, Fehler tritt nur auf, wenn Verbindungszeichenfolge dynamisch erstellt wird

public void CreateNewConnectionStringInConfig(string initialCatalog) 
{ 
     SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
     builder.DataSource = ConfigurationManager.AppSettings["Data Source"]; 
     builder.PersistSecurityInfo = true; 
     builder.InitialCatalog = initialCatalog; //This is the DB name 
     builder.UserID = ConfigurationManager.AppSettings["User ID"]; 
     builder.Password = ConfigurationManager.AppSettings["Password"]; 

     // Get the application configuration file. 
     Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

     // Create a connection string element. 
     ConnectionStringSettings csSettings = new ConnectionStringSettings("UserSelectedConnectionString", builder.ConnectionString, "System.Data.SqlClient"); 

     // Get the connection strings section. 
     ConnectionStringsSection csSection = config.ConnectionStrings; 

     // Add the new element. 
     csSection.ConnectionStrings.Add(csSettings); 

     // Save the configuration file. 
     config.Save(ConfigurationSaveMode.Modified); 

    // Refresh the section so the new configuration can be re-read 
     ConfigurationManager.RefreshSection("connectionStrings"); 

} 

I geprüft und die Verbindungszeichenfolge in der Datei vshost.exe.Config Fein erstellt immer beim Debuggen. Wenn ich versuche, das Datenbank-Objekt zu erstellen, erhalte ich einen Fehler. Der Code zum Erstellen des DB-Objekts ist wie folgt.

public class MyDac 
{ 
    private readonly Database _db; 

    public MyDac() 
    { 
     DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
     _db = factory.Create("UserSelectedConnectionString"); 
    } 
} 

Ich erhalte den folgenden Fehler beim Versuch, das _db-Objekt zu erstellen.

Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString" 

Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type Database, key "UserSelectedConnectionString" --->  Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "UserSelectedConnectionString". 
Exception occurred while: while resolving. 
Exception is: InvalidOperationException - The type Database does not have an accessible constructor. 

Dinge, die ich versucht habe:

1) Aktualisieren der Enterprise Library Version 6.0.0.0 behebt das Problem, aber das ist für mich keine Option. Ich muss es auf Version 5.0.505.0 behalten.

2) Wenn ich die Verbindungszeichenfolge in der App.config-Datei aus der Hand hart Code (anstatt es während der Laufzeit schreiben), funktioniert die App gut. Das kann ich jedoch nicht im wirklichen Leben tun, da sich der Datenbankname ständig ändert.

Jede Hilfe wird sehr geschätzt. Vielen Dank!

Antwort

0

Ich habe meinen Code wie unten gezeigt geändert und das hat angefangen zu arbeiten. Jedoch habe ich keine Erklärung dafür:

public class MyDac 
{ 
    private readonly Database _db; 

    public MyDac() 
    { 
     _db = new SqlDatabase("UserSelectedConnectionString"); 
    } 
} 
Verwandte Themen