繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM