【问题标题】:C# stored procedure won't save dataC# 存储过程不会保存数据
【发布时间】:2021-09-30 22:17:19
【问题描述】:

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

代码:

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

有什么想法吗?

【问题讨论】:

  • 它是否击中了成功保存的行?
  • 这是什么:cmd.Parameters.AddWithValue("@Id", SqlDbType.Int);应该是一个 INT 值,对吧?
  • 你有一个带有替代快捷方式DataDirectory的连接字符串吗?
  • 回应史蒂夫的评论;我最初的想法是您正在查找错误的数据库。为了测试这一点,在你有 cn.close() 之前的行上放:var dt = new DataTable(); var da = new SqlDataAdapter("select * from orders", cn); da.Fill(dt); 然后在cn.close 上放一个断点,当代码停止指向dt 并单击放大镜;你看到你的数据了吗?
  • 你不生成id;你让数据库来做 - 将其身份规范设置为自动递增/种子 1 步骤 1 并不管它。根本不要在您的插入语句中提及它,它会自动生成。如果您想知道生成了什么 id,您可以使用 SELECT SCOPE_IDENTITY() 完成您的存储过程并改为执行标量您的存储过程

标签: c# sql-server winforms stored-procedures


【解决方案1】:

由于您使用 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"))

这完全取决于文化信息

【讨论】:

  • ini.Parse() 我得到Input string was not in a correct format.
  • 这是导致您的错误的原因。检查字符串并尝试 Int32。解析()。 ini 是一个错字
  • 例如Console.WriteLine(totalAmountL.Text); 我得到16,500
  • 这只是一个提示。该值应具有 int 类型。字符串取决于文化和格式。你可以试试 Convert.ToInt32(double.Parse(totalAmountL.Text)) 例如
  • @mafortis 最好是stop using AddWithValue
猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多