【发布时间】: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