来自web.config的连接字符串导致NullReferenceException

时间:2017-06-04 10:50:35

标签: c# asp.net

我有一个本地SQL Server数据库(通过Management Studio管理)和本地 ASP.NET项目。 VS2017在服务器资源管理器中正确查看数据库。这也是我得到连接字符串的地方;正如互联网上的一些帖子所建议的那样。我在我的web.config中将字符串放在现有字符串旁边(用于帐户管理)。该文件如下所示:

<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>

我尝试像这样访问第二个字符串:

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

完成的方式是herehereherehere(几乎所有其他帖子都有关)。但是,当我运行代码时,我得到以下异常:

  

System.NullReferenceException:未将对象引用设置为对象的实例。

     

在ProjectUnitTests.DatabaseTests.TestConnection()中的ProjectUnitTests \ DatabaseTests.cs:第16行

我在这里设置了using System.Configuration;的引用。我也非常确定web.config上的格式是正确的,给定this帖子让我重新检查了大约10次。我已经尝试删除第一个字符串,但它没有效果。

连接字符串是正确的。当我在我的代码中直接使用它时,我可以访问数据库。

请注意,代码是从另一个项目运行的;我有一个代码运行的类库。 Web.config文件位于另一个项目中。我在长期寻找的答案中读到这可能是一个问题;虽然我找不到更多的消息来源。

编辑:

根据要求;单元测试中的整个方法:

[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); 
}

数据库类:

    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);
        }
    }

为什么我不能在这里访问web.config属性?

1 个答案:

答案 0 :(得分:0)

您需要将数据库条目添加到单元测试项目的配置中。此文件将被称为app.config,并且将位于单元测试项目的根文件夹中。当项目构建时,文件将在bin文件夹中变为'dllname.config(构建过程应该为你处理)。

(我的假设是这是真的是基于堆栈跟踪中的这一提及 - ProjectUnitTests)。