c# - 数据不会保存在我的数据库中

时间:2017-12-01 12:10:43

标签: c# sql database stored-procedures

我的数据不会保存在我的数据库中。而不是进入"产品已被添加",它转到"产品ID已经存在"即使它没有。这是代码:

private void btnAddProduct_Click(object sender, EventArgs e)
    {
        if(txtNewProductID.Text == "" || txtNewProductName.Text == "" || txtNewProductPrice.Text == "" || cboNewProductCategory.Text == "")
        {
            MessageBox.Show("Please fill up the form!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }

        else
        {
            int prodQty = Convert.ToInt32(txtNewProductQuantity.Text);
            decimal prodPrice = Convert.ToDecimal(txtNewProductPrice.Text);

            if (!myData.AddProducts(txtNewProductID.Text, txtNewProductName.Text, prodQty, prodPrice, cboNewProductCategory.Text))
            {
               MessageBox.Show("Product has been added!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            else
            {
                if (MessageBox.Show("Product ID already exist", "Message", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning) == DialogResult.Retry)
                {
                    txtNewProductID.Clear();
                    txtNewProductName.Clear();
                    txtNewProductPrice.Clear();
                    txtNewProductQuantity.Clear();
                }
            }
        }
    }

这是我的类库中的代码:

public bool AddProducts(string productID, string productName, int productQuantity, decimal productPrice, string productCategory)
    {
        bool recordFound = false;
        myCon.Open();

        try
        {
            SqlCommand saveProduct = new SqlCommand("AddProduct", myCon);
            saveProduct.CommandType = CommandType.StoredProcedure;
            saveProduct.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = productID;
            saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName;
            saveProduct.Parameters.Add("@ProductName", SqlDbType.Int).Value = productQuantity;
            saveProduct.Parameters.Add("@ProductPrice", SqlDbType.Decimal).Value = productPrice;
            saveProduct.Parameters.Add("@ProductCategory", SqlDbType.NVarChar).Value = productCategory;
            saveProduct.ExecuteNonQuery();
            myCon.Close();
        }
        catch
        {
            myCon.Close();
            recordFound = true;
        }

        return recordFound;
    }

这来自我的存储过程:

CREATE PROCEDURE [dbo].[AddProduct]
@ProductID nvarchar(50),
@ProductName varchar(50),
@ProductQuantity int,
@ProductPrice decimal(18,2),
@ProductCategory nvarchar(50)
AS
INSERT INTO ProductsTbl
VALUES (@ProductID, @ProductName, @ProductQuantity, @ProductPrice, @ProductCategory)
RETURN 0

它有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您在此处有一个复制粘贴问题:

saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName;
saveProduct.Parameters.Add("@ProductName", SqlDbType.Int).Value = productQuantity;

相反,它必须是:

saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName;
saveProduct.Parameters.Add("@ProductQuantity", SqlDbType.Int).Value = productQuantity;

顺便说一下,不要使用Catch来关闭连接。相反,我强烈建议使用using - 语句进行连接和命令。确保每次此方法完成时关闭连接。请注意,con.Close不会关闭物理连接,但它只是告诉连接池它已准备好在其他地方使用。否则你阻止它,所以每次必须打开一个新的连接:

public bool AddProducts(string productID, string productName, int productQuantity, decimal productPrice, string productCategory)
{
    bool recordFound = false;

    try
    {
        using (var myCon = new SqlConnection("Connection-String from config-file"))
        using (var saveProduct = new SqlCommand("AddProduct", myCon))
        {
            saveProduct.CommandType = CommandType.StoredProcedure;
            saveProduct.Parameters.Add("@ProductID", SqlDbType.NVarChar).Value = productID;
            saveProduct.Parameters.Add("@ProductName", SqlDbType.VarChar).Value = productName;
            saveProduct.Parameters.Add("@ProductQuantity", SqlDbType.Int).Value = productQuantity;
            saveProduct.Parameters.Add("@ProductPrice", SqlDbType.Decimal).Value = productPrice;
            saveProduct.Parameters.Add("@ProductCategory", SqlDbType.NVarChar).Value = productCategory;
            myCon.Open(); // will be closed implicitely at the end of the using
            saveProduct.ExecuteNonQuery();
        }
    }
    catch (SqlException ex) when (new[] {2627, 2601}.Contains(ex.ErrorCode))
    {
        // index constraint
        recordFound = true;
    }
    catch(Exception otherExceptions)
    {
        // log this!
        throw; // don't ignore it
    }

    return recordFound;
}