尝试使用asp.net更新数据库时出现异常错误

时间:2017-05-20 14:28:56

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

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

  

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();

3 个答案:

答案 0 :(得分:3)

为避免出现这类问题,建议您使用电源塔

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

     }

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

     }
}

所以权力塔的美丽,使用块将在给定的代码块内实现。因此,这将清楚地表明,这两个命令都使用了与使用相同的连接。此外,一旦代码超出范围,它将实现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();
     }
}

我不记得该集合是添加,添加范围还是连续。但无论哪种方式存在选择。

答案 1 :(得分:0)

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

将此行替换为此

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

答案 2 :(得分:0)

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