Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web.config中的连接字符串导致NullReferenceException_C#_Asp.net - Fatal编程技术网

C# web.config中的连接字符串导致NullReferenceException

C# web.config中的连接字符串导致NullReferenceException,c#,asp.net,C#,Asp.net,我有一个本地SQL Server数据库(通过Management Studio管理)和一个本地数据库 ASP.NET项目。VS2017在服务器资源管理器中正确查看数据库。这也是我获取连接字符串的地方;正如互联网上一些帖子所推荐的那样。我将该字符串放在我的web.config中现有字符串(用于帐户管理)的旁边。该文件如下所示: <configuration> <connectionStrings> <add name="DefaultConne

我有一个本地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;
这就是它的工作方式,而且(在几乎所有其他关于这个主题的帖子中)。但是,当我运行代码时,会出现以下异常:

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

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

我参考了使用System.Configuration的
设置在这里。我也很确定我的
web.config
上的格式是正确的,因为这篇文章让我重新检查了大约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
属性?

您需要将数据库条目添加到单元测试项目的配置中。该文件名为app.config,位于单元测试项目的根文件夹中。当项目生成时,该文件将“变成”bin文件夹中的dllname.config(生成过程应为您解决此问题)


(我的假设是正确的,这是基于堆栈跟踪中提到的-
ProjectUnitTests
)。

请注意,代码是从另一个项目运行的,这是您的问题。您需要确保当前项目查找的web.config与您在其中定义连接字符串的web.config相同。请将web.config复制到TestProject中,并将名称从web.config更改为app。config@KobyDouek但是,当使用
配置管理器时,这应该会起作用,这就是我遇到的问题。。。(请参阅:,)这些链接是关于访问其“主机”的配置设置的类库的。如果DLL在ASP.NET项目中运行,那么它确实可以访问ASP.NET主机的配置项。但是您的错误似乎源于测试项目,在这种情况下,ASP.NET项目可能不是主机。相反,主机是您正在使用的单元测试框架的运行者(例如NUnit)。请参见示例。@mjwills Ewh,这是不同的。很高兴知道。这个问题也存在于我正在使用的类库中;但是我偶然发现ASP在默认情况下没有正确的日志记录,所以我开始对它进行单元测试,看看到底出了什么问题。你说的是,它应该在类库中工作,因为ASP项目是它的宿主。这段代码确实来自一个单元测试项目,但正如我在上一篇评论中提到的,我首先在类库中偶然发现了这个错误。我在帖子和评论中提到的链接都提到它应该在类库中运行,但我无法让它工作(你能给我们看一下整个TestConnection方法,以及ASP.NET项目中显示错误的整个方法吗?当然,但正如问题上的注释所示,我显然无法从单元测试中访问字符串。从类库中,我现在可以检索连接字符串。我将在m中的编辑中包含代码在中。如果您按照我的答案中的说明进行操作,您应该能够在单元测试中看到字符串(不过,公平地说,您可能不应该在单元测试中访问数据库)。不,我不应该。我知道这一点,但我的学校没有,并且要求我对所有内容进行单元测试。无论如何,感谢您的提醒:)我现在遇到的问题是,当我从单元测试创建实例时,我无法访问字符串。回想起来这一直是我的问题,我不知道它是从另一个主机运行的。谢谢你抽出时间。