【问题标题】:Exception Error in trying to update database using asp.net尝试使用 asp.net 更新数据库时出现异常错误
【发布时间】:2017-10-20 14:07:35
【问题描述】:

为什么我在尝试更新我的数据库时遇到此错误?

ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭

代码如下:

cmd1 = new SqlCommand("UPDATE [guitarBrands] SET type = @type, name = @name, image = @image WHERE id = @id", con1);

con1.Open();

cmd1.Parameters.Add(new SqlParameter("type", newType.Text));
cmd1.Parameters.Add(new SqlParameter("name", newName.Text));
cmd1.Parameters.Add(new SqlParameter("image", newImage.Text));
cmd1.Parameters.Add(new SqlParameter("id", id));

cmd1.ExecuteNonQuery();

con1.Close();
cmd1.Parameters.Clear();

cmd = new SqlCommand("UPDATE [guitarItems] SET brand = @brand WHERE id = @id", con1);
con.Open();

cmd.Parameters.Add(new SqlParameter("brand", newName.Text));
cmd.Parameters.Add(new SqlParameter("id", id));

cmd.ExecuteNonQuery();
con.Close();

cmd.Parameters.Clear();

【问题讨论】:

  • 您没有正确处理您的IDisposable (SqlConnection) 项目。它们应该包含在 using 语句中,以便正确处理它们。这也将有助于解决变量中的范围问题。另外,为什么要使用两个不同的连接?您是在处理一个数据库还是两个?
  • @mason - 是的,我正在使用两个数据库。
  • 你应该让你的变量名更明确。您会感到困惑,因为您同时使用了con 和con1。您正在使用con1 执行两个查询,而没有使用con。查看您传递给第二个SqlCommand 的参数。
  • @mason - 哦,我明白了..你的权利。如果现在一切正常,我将尝试代码..

标签: c# sql asp.net sql-server


【解决方案1】:

为避免此类问题,建议您使用权力之塔。

using(var connection = new SqlConnection(dbConnection))
{
     connection.Open();
     using(var command = new SqlCommand(query, connection)
     {

     }

     using(var command = new SqlCommand(query, connection)
     {

     }
}

因此,权力之塔的美丽之处在于,使用块将在给定的代码块中实现 via。所以这将清楚地表明,这两个命令都在使用相同的连接。此外,一旦代码超出范围,它将实现IDispose,这将调用垃圾收集器来释放您的资源。

另外,你应该选择。 SqlCommand,接受一个参数数组。因此,如果您使用方法调用,您可以简单地执行以下操作:

public static GetExample(string query, params SqlParameter[] parameters)
{
     using(var connection = new SqlConnection("YourDbConnection"))
     using(var command = new SqlCommand("YourQuery", connection))
     {
          connection.Open();
          if(parameters != null)
               if(parameters.Any())
                    command.Parameters.Add(parameters);

          command.ExecuteNonQuery();
     }
}

我不记得该集合是添加、添加范围还是连接。但无论哪种方式都存在。

【讨论】:

  • @BrunoEarth 如果您有权访问它们都属于的实例。您可以修改连接以与两者通话。这里的例子。 stackoverflow.com/questions/25253548/…
  • 还有一个问题,GetExample方法中的字符串查询有必要吗?因为我注意到它没有在那个方法中使用。
  • @BrunoEarth 一旦您添加了实际的 SqlConnection 和 SqlCommand,它将被使用。
  • 您能否将其添加到您的解决方案中?这样我就知道在哪里放置 SqlConnection 和 SqlCommand..
  • 您的解决方案似乎不起作用。变量连接未被识别。
【解决方案2】:
cmd = new SqlCommand("UPDATE [guitarItems] SET brand = @brand WHERE id = @id", con1);

把这行换成这个

cmd = new SqlCommand("UPDATE [guitarItems] SET brand = @brand WHERE id = @id", con);

【讨论】:

    【解决方案3】:

    在您的代码中,您在命令“cmd1”和“cmd”中都使用了 Connexion“con1”。两个命令只使用一个连接是可以的,但是您应该保持连接打开,直到两个命令都执行。 在您的情况下,您选择为第二个命令使用新的连接“con”,但您重新打开“con1”。 所以你会得到一个错误,因为 "con" 永远不会打开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多