在asp.net和SQL SERVER 2008中插入/更新
本文关键字:插入 更新 2008 SERVER asp net SQL | 更新日期: 2023-09-27 17:57:41
如果请求的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
之前,我必须打开我的连接。但我想知道写这些开头和结尾内容的标准方法。它看起来有点随意。我该如何改进?
您可以使用Convert.ToInt32()方法将结果转换为整数值。
如果该值是CCD_ 5,则它将其转换为CCD_。
试试这个:
int count = Convert.ToInt32(cmd.ExecuteScalar());
考虑在sql server中使用MERGE子句。这是一篇你可以使用的好的微软文章。
当您逐步执行代码时,它会做什么?
在某些SQL排序规则(例如Latin1_General_BIN)中,变量区分大小写。在您的第一个select语句中,查询中有@P
rodName,参数集合中有@p
rodName。如果你有一个区分大小写的排序规则,你永远不会超过这一部分。在Management Studio中右键单击数据库,然后单击"属性"以查找排序规则。
错误表示没有连接。你可以先检查一下这个问题吗?所以
检查连接,如果不为null并且此时存在,则检查其con。State=Open或任何其他值。我的连接状态是关闭打开的。但首先连接声明在哪里?我在你的代码中看不到。
试试这个:
//USING THE STATEMNET USING IT WILL TAKE CARE TO DISPOSE CONNECTION AND PLACE TRY CATCH WITHIN PROCS
{
using (SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings("connectionString"))) {
if (cnn.State == System.Data.ConnectionState.Closed)
cnn.Open();
using (SqlCommand cmd = new SqlCommand()) {
try {
cmd.Connection = cnn;
cmd.CommandText = "YOUR SQL STATEMENT";
int I = Convert.ToInt32(cmd.ExecuteNonQuery);
if (I > 0)
{
cmd.CommandText = "YOUR SQL STATEMENT";
//ADDITIONAL PARAMTERES
}
else
{
cmd.CommandText = "YOUR SQL STATEMENT";
//ADDITIONAL PARAMETERS
}
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
}
您可以尝试此代码。首先写一个存储过程:
CREATE PROCEDURE sprocquanupdateinsert
@prodName nvarchar(250),
@quantity int
AS
BEGIN
UPDATE tblStock
SET quantity = @quantity
WHERE prodName = @prodName
IF @@ROWCOUNT = 0
INSERT INTO tblStock(prodName, quantity)
VALUES (@prodName, @quantity)
END
GO
然后在后面的代码中,你可以使用这个
using (conn)
{
SqlCommand cmd = new SqlCommand("sprocquanupdateinsert", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@prodName", stock.prodName);
cmd.Parameters.AddWithValue("@quantity", stock.quantity);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}