【问题标题】:Possible reasons why SqlConnection is NULLSqlConnection 为 NULL 的可能原因
【发布时间】:2013-01-06 23:10:36
【问题描述】:

使用最近安装的 Visual Studio 2012,但现在我无法连接到我们的 SQL Server 数据库。

这些是我正在遵循的步骤

  1. 创建App1.config
  2. 在App1.config 中输入:

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
       <connectionStrings>
         <add name ="xxx" connectionString="USER ID=xx;PASSWORD=xx;PERSIST SECURITY INFO=True;Data Source=xx;Initial Catalog=xx" />
       </connectionStrings>
     </configuration>
    
  3. 将项目引用添加到System.Configuration

  4. 通过以下方式创建对命名空间的访问:

     using System.Data.SqlClient;
     using System.Data;
     using System.Configuration;
    
  5. 执行以下操作:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    
    namespace ConsoleApplication10 {
        class Program {
            static void Main(string[] args) {
    
                SqlConnection conn = null;
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["xxx"].ConnectionString);
    
            }
        }
    }
    
  6. 我创建了一个新的控制台应用程序并添加了上述内容,但我仍然收到错误 NullReferenceException was unhandled Object reference not set to an instance of an object. ...

编辑

通过即时窗口,我确定以下内容为空:

ConfigurationManager.ConnectionStrings["xxx"].ConnectionString

如果我将连接字符串硬编码到SqlConnection 的构造函数中,那么它可以连接

我错过了什么 - 一些非常明显的东西!还是这与我的新 VS 有关?

【问题讨论】:

  • 使用调试器准确确定哪个变量/表达式为空。
  • 什么是空的? conn 或ConfigurationManager 返回的连接字符串?
  • 格式不佳,请查看您的问题。一些零件丢失了
  • @Cyber​​maxs 好的 - 我将准确确定什么是 null 并添加到 OP
  • @ThorstenDittmar - 谢谢:看起来配置管理器正在返回一个空字符串 - 如果我将字符串硬编码,那么它执行得很好

标签: c# visual-studio ado.net


【解决方案1】:

通过至少执行以下操作来检查 ConfigurationManager.ConnectionStrings 中的内容:

if (ConfigurationManager.ConnectionStrings != null ) {
    Console.WriteLine(ConfigurationManager.ConnectionStrings.Count);
    Console.WriteLine(ConfigurationManager.ConnectionStrings[0].ConnectionString);
    Console.WriteLine(ConfigurationManager.ConnectionStrings[0].Name);
    ....
} else {
    Console.WriteLine("null");
}

这将突出任何明显的问题,例如 App.config 文件的重复,这很可能是您在 OP 中提到的 App1.config 的情况。

【讨论】:

  • +1 感谢您的所有帮助 - 这是一个令人沮丧的问题,但如果您觉得好心,您可能想取消它似乎正在收集的一些反对票!
  • @whytheq 我认为downvote 来自格式而不是问题的相关性。
  • 格式看起来不错 - 我已经用所有代码和屏幕截图充分解释了问题......刚刚用我令人尴尬的发现编辑了你的答案!
  • 你错过了ConfigurationManager.ConnectionStrings
  • @JohnSaunders no - 我在解决方案中添加了一个配置文件,其中已经有一个;所以即使我使用了正确的名称,我认为该项目指的是原始配置文件。一旦我删除了其中一个并重命名为 App.config 而不是 App1.config 一切都在世界上很好!
【解决方案2】:

检查您的输出文件夹。

假设您的应用程序名为myapp.exe,则应该有myapp.exe.config。

这应该存在,并且应该包含 Visual Studio 中 app.config 文件的内容。

如果没有,请检查您在别处是否已经有 app.config 文件(我注意到您将文件称为 app1.config)

【讨论】:

  • 即使不存在也会使用默认值。
  • +1 感谢汤姆 - 正如您注意到 app1.config 是问题所在。我认为这是一个相关的问题,但已经在 -2 上!
  • @whytheq 没问题。如果可以的话,你能接受这个作为答案吗?
【解决方案3】:

您是否尝试过检查 ConfigurationManager.ConnectionStrings["xxx"].ConnectionString 的值并使用该值进行硬编码?你还是 null 吗?

还建议像这样创建连接:

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["xxx"].ConnectionString))
{
        //code        
}

我会回复但我还没有足够的代表... :-(

【讨论】:

  • 让我试试硬编码;可以确定是否是导致问题的连接引用
【解决方案4】:

根据您的代码还没有对conn“做任何事情”这一事实进行猜测,我很确定ConfigurationManager为您传入的连接字符串名称返回null。异常被抛出SqlConnection 的构造函数在传入null 而不是有效的连接字符串时。

【讨论】:

  • 如果我添加代码以便我的代码执行某些操作 - 例如运行存储过程,但在这行代码上仍然出错
  • 当然可以!我的意思是:由于您在问题中发布的源代码中没有使用conn,因此可以成为null 的唯一内容是ConfigurationManager 调用的结果。如果有其他代码实际上使用 conn,conn 也可能是null,导致异常。但事实并非如此,所以异常必须来自SqlCommands构造函数。
  • +1 感谢您的帮助(虽然我几乎可以看到你的耳朵冒出烟雾!!)好像我的解决方案中有重复的应用程序文件!
  • 我知道:我可以打自己的脸!...我可以手动编辑它们不吗? ...通过解决方案中的属性部分?
  • 是的,连接字符串是一个设置。
【解决方案5】:

当您将连接字符串作为连接字符串放置在 Properties->Settings 中时,使用完整的命名空间访问它们,然后您就完成了。

看我的回答here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2020-10-13
    相关资源
    最近更新 更多