【问题标题】:Issues connecting to a SQL Server database in C#在 C# 中连接到 SQL Server 数据库的问题
【发布时间】:2014-10-19 21:04:20
【问题描述】:

我在这里How to set SQL Server connection string? 找到了这篇文章的大部分代码。

这就是我所拥有的:

SqlConnection conn = new SqlConnection();

conn.ConnectionString = "Data Source=(localdb)\\Instance;" +
                        "Initial Catalog=Database;" +
                        "User id=root;Password=pass;";

try
{
     conn.Open();
}
catch (Exception ex)
{
     Console.WriteLine(ex.ToString());
}

SqlCommand myCommand = new SqlCommand("INSERT INTO Database.dbo.Table" +
                                      "VALUES ('stg', 'stg1', 'stg2', 'stg3');", conn);

try
{
     conn.Close();
}
catch (Exception ex)
{
     Console.WriteLine(ex.ToString());
}

很多以前的代码都给了我错误。有一次,我收到无法连接到实例的错误。这是“\”的问题。它把它识别为一个转义字符,所以我做了双 '\' 来摆脱它,所以我不再收到那个错误,所以这不应该是问题。

我收到有关用户名和密码错误的错误消息。我正在使用 SQL Server 身份验证,而我之前使用的代码是指定 Windows 身份验证。我不再收到那个错误了。

截至目前,代码一直执行,没有任何错误。但是,当我检查数据库时(我使用的是 SQL Server Management Studio),表中没有插入任何内容。我已经直接运行了 Insert 语句,它工作正常,所以我不确定这里有什么问题。另外,我正在使用 VS 2013。

【问题讨论】:

  • 不想太苛刻,但是在开始这种编程之前,您是否阅读过有关 ADO.NET 的任何教程?您手中有一个非常强大的工具,您应该尝试了解它的工作原理,否则此类问题将反复出现。

标签: c# sql-server


【解决方案1】:

您根本没有使用SqlCommand.ExecuteNonQuery 来使用插入命令。因此没有插入任何内容。

SqlCommand myCommand = new SqlCommand("INSERT INTO Database.dbo.Table" +
                                      "VALUES ('stg', 'stg1', 'stg2', 'stg3');", conn);
int inserted = myCommand.ExecuteNonQuery();

您还应该使用using-statement 来确保所有非托管资源都已被释放,并且即使出现错误连接也会关闭。那么你就不需要显式使用conn.Close了。

【讨论】:

    【解决方案2】:

    您没有执行查询。在创建命令对象后添加:

    myCommand.ExecuteNonQuery();
    

    旁注:您应该在所有代码周围使用try...catch,并使用using 块进行连接和命令。这将确保无论发生什么,对象都被关闭并正确处理:

    try {
    
      using (SqlConnection conn = new SqlConnection()) {
    
        conn.ConnectionString =
          "Data Source=(localdb)\\Instance;" +
          "Initial Catalog=Database;" +
          "User id=root;" +
          "Password=pass;";
    
        conn.Open();
    
        using (SqlCommand myCommand = new SqlCommand("INSERT INTO Database.dbo.Table" +
                                          "VALUES ('stg', 'stg1', 'stg2', 'stg3');", conn)) {
          myCommand.ExecuteNonQuery();
        }
    
      }
    
    } catch (Exception ex) {
      Console.WriteLine(ex.ToString());
    }
    

    【讨论】:

    • catch (Exception) 是一个你不应该开始新程序员的坏习惯。至少,捕获您期望的特定异常(在本例中为SqlException)。更好的是,如果您的程序没有处理异常的策略,请不要让它崩溃。
    • @JeroenMostert:这是一个很好的观点,我想提一下,但让它更接近原始代码。无论如何,将错误消息写入控制台似乎是处理错误的临时措施。
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多