在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之前,我必须打开我的连接。但我想知道写这些开头和结尾内容的标准方法。它看起来有点随意。我该如何改进?

在asp.net和SQL SERVER 2008中插入/更新

您可以使用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();
}