【发布时间】:2017-06-04 10:50:34
【问题描述】:
我有一个本地 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;
here、here、here 和 here(几乎所有其他关于该主题的帖子)是这样完成的。但是,当我运行代码时,出现以下异常:
System.NullReferenceException:对象引用未设置为对象的实例。
在 ProjectUnitTests\DatabaseTests.cs:line 16 中的 ProjectUnitTests.DatabaseTests.TestConnection() 处
我在这里设置了对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 属性?
【问题讨论】:
-
请注意,代码是从另一个项目运行的 - 好吧,这就是你的问题。您需要确保您当前的项目查找与您定义连接字符串相同的 web.config。
-
将 web.config 复制到 TestProject 并将名称从 web.config 更改为 app.config
-
@KobyDouek 但这在使用
ConfigurationManager时应该可以工作,这就是我遇到的问题......(参见:stackoverflow.com/questions/8422072/…,stackoverflow.com/questions/18682078/…,stackoverflow.com/questions/7652757/…) -
这些链接是关于访问其“主机”配置设置的类库。如果 DLL 在 ASP.NET 项目中运行,那么它确实可以访问 ASP.NET 主机的配置条目。但是您的错误似乎来自一个测试项目——在这种情况下,ASP.NET 项目可能不是主机。相反,主机是您正在使用的单元测试框架(例如 NUnit)的运行程序。例如,请参阅nunit.org/index.php?p=configFiles&r=2.5。
-
@mjwills Ewh,那是不同的。很高兴知道。这个问题也存在于我正在使用的类库中;但我偶然发现 ASP 默认情况下没有正确的日志记录,所以我开始使用单元测试来查看真正出错的地方。你说的是它应该在类库中工作,因为 ASP 项目是它的宿主?