![](/img/trans.png)
[英]How to insert a list of values into SQL Server 2008 from asp.net using C#
[英]Insert/Update in asp.net and SQL SERVER 2008
如果数据库中不存在请求的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()方法将结果转换为整数值。
如果该值为null
,则将其转换为0
。
尝试这个:
int count = Convert.ToInt32(cmd.ExecuteScalar());
考虑在sql-server中使用MERGE子句。 这是您可以使用的很好的Microsoft文章 。
当您逐步执行代码时,它会做什么?
在某些SQL归类中(例如,Latin1_General_BIN),变量区分大小写。 在第一个select语句中,查询中有@ P
rodName,参数集合中有@ p
rodName。 如果您有区分大小写的排序规则,那么您永远都不会错过这一部分。 右键单击Management Studio中的数据库,然后单击“属性”以查找排序规则。
错误说没有连接,可以先检查一下所有问题
检查连接,如果不为空并且存在,请检查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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.