首页 > 解决方案 > C# 存储过程不会保存数据

问题描述

我编写了一个存储过程来存储我的表单数据,虽然我没有收到任何错误,但我的数据不会保存在数据库中。

代码:

private void doneBtn_Click(object sender, EventArgs e)
{
    try
    {
        using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["SampleDatabaseWalkthrough.Properties.Settings.SampleDatabaseConnectionString"].ConnectionString))
        {
            if (cn.State == ConnectionState.Closed)
                cn.Open();

            using (SqlCommand cmd = new SqlCommand("dbo.InsertOrder", cn))
            {
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@Id", SqlDbType.Int);
                cmd.Parameters.AddWithValue("@ProductId", null);
                cmd.Parameters.AddWithValue("@OrderQuantity", double.Parse(qtyAmountL.Text));
                cmd.Parameters.AddWithValue("@CustomerID", null);
                cmd.Parameters.AddWithValue("@OrderDate", today.ToString("dd/MM/yyyy"));
                cmd.Parameters.AddWithValue("@Tax", double.Parse(taxAmountL.Text));
                cmd.Parameters.AddWithValue("@Total", double.Parse(totalAmountL.Text));
                cmd.Parameters.AddWithValue("@Net", double.Parse(subtotalAmountL.Text));

                cmd.ExecuteNonQuery();

                cn.Close();

                MessageBox.Show("Successfully saved");
            }
        }
    }
    catch (SqlException ex)
    {
        StringBuilder errorMessages = new StringBuilder();

        for (int i = 0; i < ex.Errors.Count; i++)
        {
            errorMessages.Append("Index #" + i + "\n" +
                "Message: " + ex.Errors[i].Message + "\n" +
                "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                "Source: " + ex.Errors[i].Source + "\n" +
                "Procedure: " + ex.Errors[i].Procedure + "\n");
        }

        Console.WriteLine(errorMessages.ToString());
    }
}

这是我的存储过程:

CREATE PROCEDURE [dbo].[InsertOrder]
    @Id int,
    @ProductId int = NULL,
    @OrderQuantity int,
    @CustomerID int = NULL,
    @OrderDate varchar(50),
    @Tax int,
    @Total int,
    @Net int
AS
BEGIN
    INSERT INTO Orders (Id, ProductId, OrderQuantity, CustomerID, OrderDate, Tax,Total, Net) 
    VALUES (@Id, @ProductId, @OrderQuantity, @CustomerID, @OrderDate, @Tax, @Total, @Net)
END

有任何想法吗?

标签: c#sql-serverwinformsstored-procedures

解决方案


由于您使用 AddWithValue,您需要正确的转换,插入

    cmd.Parameters.AddWithValue("@Tax", double.Parse(taxAmountL.Text));
md.Parameters.AddWithValue("@Total", double.Parse(totalAmountL.Text));
 cmd.Parameters.AddWithValue("@Net", double.Parse(subtotalAmountL.Text));

应该

   cmd.Parameters.AddWithValue("@Tax", Int32.Parse(taxAmountL.Text));
md.Parameters.AddWithValue("@Total", ConvertTo.Int32(totalAmountL.Text));
.....

或更好

 if (Int32.TryParse(subtotalAmountL.Text, out int numValue))
cmd.Parameters.AddWithValue("@Net", numValue);
else ....return error

也应该是

cmd.Parameters.AddWithValue("@ProductId", DBNull.Value);

更新

由于我收到了一些问题,因此需要更多详细信息。

这只是一个提示,我的意思是值应该是整数类型。

例如,如果您将值格式化为“16,500”,这是有效的

int.Parse("16,500", NumberStyles.AllowThousands);
//or
Convert.ToInt32(double.Parse("16,500"))

这完全取决于文化信息


推荐阅读