c# - 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
有任何想法吗?
解决方案
由于您使用 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"))
这完全取决于文化信息
推荐阅读
- android - 我无法从搜索栏获得输出
- python - 遍历python中的字典列表
- postgresql - 23502:“id”列中的空值违反 postgreSQL 中的非空约束
- flutter - 如何将导航添加到 Flutter 中的元素列表
- javascript - 如何使用 n-readline 和 Express - 在第一次请求期间数据不可用
- wordpress - 上传图像/媒体时缺少临时文件夹错误
- nginx - nginx-rtmp 视频流搜索功能
- sqlite - 运行 lein 迁移时未找到数据库
- javascript - 如何将带有 Vue 代码的按钮嵌入到使用 insertCell() 插入的单元格中?
- r - 找出向量中数字的所有组合。R 编程