【发布时间】:2016-10-09 18:27:03
【问题描述】:
如果请求的prodName 在数据库中不存在,我正在尝试插入一条记录。如果存在,我想更新 quantity 属性的值。我使用了以下它既不插入也不更新任何记录。我得到以下异常:
ExecuteScalar requires an open and available Connection. The connection's current state is closed
这是代码
public static void manageStock(CompanyStock stock)
{
///// Check if record exists/////////
cmd = new SqlCommand("select count(*) from tblStock where prodName=@prodName", con);
cmd.Parameters.AddWithValue("@prodName", stock.prodName);
con.Open();
Int32 count = (Int32)cmd.ExecuteScalar(); //returns null if doesnt exist
con.Close();
if (count > 0)
{
cmd = new SqlCommand("update tblStock set quantity = @quantity where prodName=@prodName", con);
cmd.Parameters.AddWithValue("@prodName", stock.prodName);
cmd.Parameters.AddWithValue("@quantity", stock.quantity);
}
else
{
cmd = new SqlCommand("insert into tblStock(prodName,quantity) values (@prodName, @quantity)", con);
cmd.Parameters.AddWithValue("@prodName",stock.prodName);
cmd.Parameters.AddWithValue("@quantity",stock.quantity);
}
try
{
con.Open();
cmd.ExecuteNonQuery();
}
finally
{
con.Close();
}
}
}
已编辑
我编辑了我的代码。它现在工作正常。在执行ExecuteScalar 之前,我必须打开我的连接,但我想知道编写这个打开和关闭内容的标准方式。看起来有点随意。我该如何改进?
【问题讨论】:
-
我相信您需要在执行第一个命令对象之前打开连接。我不确定你的代码是如何执行的。如果这确实是代码,它将始终执行 INSERT into tblStock 命令。
-
你的代码有什么问题是你没有处理你的异常,所以你看不到可能告诉你问题到底是什么的错误消息。
-
@Pleun 如果没有
catch,他们不会冒泡吗?虽然听起来堆栈中可能还有其他东西正在吞噬某处。 -
编辑了我的问题。请再看一遍
标签: c# asp.net sql-server insert-update