2017-06-04 5 views
0

Ich habe eine lokale SQL Server-Datenbank (verwaltet über Management Studio) und ein lokales ASP.NET-Projekt. VS2017 sieht die Datenbank im Server-Explorer korrekt. Dies ist auch der Ort, an dem ich meine Verbindungszeichenfolge erhalten habe. wie von einigen Posts im Internet empfohlen. Ich habe den String neben dem vorhandenen (für die Kontoverwaltung) in meinem web.config platziert. Die Datei sieht wie folgt aus:Verbindungszeichenfolge von web.config verursacht NullReferenceException

<configuration> 
    <connectionStrings> 
     <add name="DefaultConnection" 
      connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-Project-20170524124716.mdf;Initial Catalog=aspnet-Project-20170524124716;Integrated Security=True" 
      providerName="System.Data.SqlClient" /> 
     <add name="MyLocalDb" 
      connectionString="Data Source=MYLAPTOP;Initial Catalog=TestDb;Integrated Security=True;" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <!--More things--> 
</configuration> 

Ich versuche, die zweite Zeichenfolge wie folgt zugreifen:

string connString = ConfigurationManager.ConnectionStrings["MyLocalDb"].ConnectionString; 

, die den Weg ist es here getan, here, here und here (unter fast allen anderen Post auf das Thema). Aber wenn ich den Code ausführen, erhalte ich die folgende Ausnahme:

System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt.

bei ProjectUnitTests.DatabaseTests.TestConnection() in ProjectUnitTests \ DatabaseTests.cs: Linie 16

Ich habe die Bezugnahme auf using System.Configuration; hier eingestellt. Ich bin mir auch ziemlich sicher, dass die Formatierung auf meinem web.config richtig ist, gegeben this post gemacht meine Überprüfung es etwa 10 mal. Ich habe versucht, die erste Zeichenfolge zu entfernen, aber es hatte keine Wirkung.

Die Verbindungszeichenfolge ist korrekt. Wenn ich es direkt in meinem Code verwende, kann ich auf die Datenbank zugreifen.

Beachten Sie, dass der Code von einem anderen Projekt ausgeführt wird; Ich habe eine Klassenbibliothek, von der der Code ausgeführt wird. Die Datei Web.config befindet sich in einem anderen Projekt. Ich habe in meiner langen Suche nach der Antwort gelesen, dass dies ein Problem sein könnte; obwohl ich dazu keine weiteren Quellen finden kann.

Edit:

auf Anfrage; das gesamte Verfahren von den Unit-Tests:

[TestMethod] 
public void TestConnection() 
{ 
    //Connection tester will be called from the constructor 
    Database instance = Database.Instance(); //The Database class is in a class library. When calling the instance it will get the connection string itself 
    string connString = ConfigurationManager.ConnectionStrings["TicketSlothLocalDb"].ConnectionString; //Test if I was able to get the string at all. Apparently this is never possible. 
    Console.WriteLine(connString); 
} 

Die Database-Klasse:

private Database() 
    { 
     openConnection(); 
    } 

    public static Database Instance() 
    { 
     _instance = _instance ?? new Database(); 

     return _instance; 
    } 

    private void openConnection() 
    { 
     try 
     { 
      string connString = ConfigurationManager.ConnectionStrings["TicketSlothLocalDb"].ConnectionString; 
      conn = new SqlConnection(connString); 
      conn.Open(); 
      openConn = true; 
      testConnection(); //Function with a small SQL query inside to verify that it is able to retrieve data from the database 
     } 
     catch (SqlException ex) 
     { 
      Console.WriteLine(ex); 
      Console.WriteLine("Password is incorrect"); 
      connectionstring = null; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Threw other exception: {0}", ex); 
     } 
    } 

Warum kann ich die web.config Eigenschaft hier nicht zugreifen?

+1

* Beachten Sie, dass der Code von einem anderen Projekt ausgeführt wird * - Nun, da ist Ihr Problem. Sie müssen sicherstellen, dass Ihr aktuelles Projekt dieselbe web.config aufruft, in der Sie Ihre Verbindungszeichenfolgen definiert haben. –

+0

Kopieren Sie die web.config in das TestProject und ändern Sie den Namen von web.config in app.config – Max

+0

@KobyDouek Aber das sollte funktionieren, wenn Sie den 'ConfigurationManager' verwenden, das ist das Problem, das ich habe ... (Siehe: https: //stackoverflow.com/questions/8422072/reading-web-config-from-class-library, https: // stackoverflow.com/questions/18682078/get-connection-string-in-klassenbibliothek-project-in-a-solution, https://stackoverflow.com/questions/7652757/access-web-config-from-separate-class- Bibliothek) – MagicLegend

Antwort

1

Sie müssen den Datenbankeintrag zu der Konfiguration für Ihr Komponententestprojekt hinzufügen. Diese Datei würde app.config heißen und wäre im Stammordner Ihres Komponententestprojekts. Wenn das Projekt erstellt wird, wird die Datei in Ihrem bin-Ordner "dllname.config" (der Build-Prozess sollte dies für Sie erledigen).

(Meine Annahme, dass dies wahr ist, basiert auf dieser Erwähnung im Stack-Trace - ProjectUnitTests).

+0

Dieser Code stammt zwar von einem Unit-Test-Projekt, aber wie ich in meinem letzten Kommentar erwähnte, stolperte ich zuerst in meiner Klassenbibliothek über den Fehler. Und die Links, die ich im Post und in den Kommentaren erwähnte, erwähnen alle, dass es von einer Klassenbibliothek funktionieren sollte, aber ich kann es nicht funktionieren. :( – MagicLegend

+0

Können Sie uns die gesamte TestConnection-Methode sowie die gesamte Methode im ASP.NET-Projekt zeigen, die den Fehler aufweist? – mjwills

+0

Natürlich, aber wie die Kommentare zu der Frage zeigen, kann ich anscheinend nicht auf die Zeichenfolge zugreifen Ein Komponententest. Aus der Klassenbibliothek kann ich jetzt die Verbindungszeichenfolge abrufen. Ich füge den Code in eine Bearbeitung in einer Min. ein – MagicLegend

Verwandte Themen