【问题标题】:Connection string from web.config causing NullReferenceException来自 web.config 的连接字符串导致 NullReferenceException
【发布时间】: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;

herehereherehere(几乎所有其他关于该主题的帖子)是这样完成的。但是,当我运行代码时,出现以下异常:

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 项目是它的宿主?

标签: c# asp.net


【解决方案1】:

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

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

【讨论】:

  • 这段代码确实来自一个单元测试项目,但正如我在上一条评论中提到的,我首先在我的类库中偶然发现了这个错误。我在帖子和 cmets 中提到的链接都提到它应该从类库中运行,但我无法让它工作。 :(
  • 你能告诉我们整个TestConnection方法,以及出现错误的ASP.NET项目中的整个方法吗?
  • 当然,但是问题上的 cmets 表明我显然无法从单元测试中访问字符串。从类库中,我现在可以检索连接字符串。我会在一分钟内将代码包含在编辑中。
  • 如果您按照我的回答中的说明进行操作,您应该能够在单元测试中看到该字符串(尽管公平地说,您可能不应该在单元测试中访问数据库) .
  • 不,我不应该。我知道这一点,但我的学校没有,并且要求我对所有内容进行单元测试。无论如何,感谢您的提醒:) 我现在遇到的问题是,当我从单元测试创​​建实例时,我无法访问字符串。回想起来这是我的问题,我不知道它是从不同的主机运行的。感谢您的宝贵时间。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多