C# web.config中的连接字符串导致NullReferenceException
我有一个本地SQL Server数据库(通过Management Studio管理)和一个本地数据库 ASP.NET项目。VS2017在服务器资源管理器中正确查看数据库。这也是我获取连接字符串的地方;正如互联网上一些帖子所推荐的那样。我将该字符串放在我的C# web.config中的连接字符串导致NullReferenceException,c#,asp.net,C#,Asp.net,我有一个本地SQL Server数据库(通过Management Studio管理)和一个本地数据库 ASP.NET项目。VS2017在服务器资源管理器中正确查看数据库。这也是我获取连接字符串的地方;正如互联网上一些帖子所推荐的那样。我将该字符串放在我的web.config中现有字符串(用于帐户管理)的旁边。该文件如下所示: <configuration> <connectionStrings> <add name="DefaultConne
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中的编辑中包含代码在中。如果您按照我的答案中的说明进行操作,您应该能够在单元测试中看到字符串(不过,公平地说,您可能不应该在单元测试中访问数据库)。不,我不应该。我知道这一点,但我的学校没有,并且要求我对所有内容进行单元测试。无论如何,感谢您的提醒:)我现在遇到的问题是,当我从单元测试创建实例时,我无法访问字符串。回想起来这一直是我的问题,我不知道它是从另一个主机运行的。谢谢你抽出时间。