我想将已售商品的数据存储到数据库中我正在使用此存储过程
ALTER proc [dbo].[StoredProd]
(@prdctName nvarchar(50),
@ordrdQnty int,
@ordrPrice money,
--@TrnId int,
--@OrdrId int,
@TrnDate datetime,
@TrnTotal money)
AS BEGIN TRANSACTION
INSERT INTO [OrderProduct]
([prdctName]
,[ordrdQnty]
,[ordrPrice])
VALUES
(@prdctName,
@ordrdQnty,
@ordrPrice )
--GETDATE() ),
if @@ERROR<>0 goto Err_
INSERT INTO [Transaction]
(/*[TrnId]
,[OrdrId],*/
[TrnDate]
,[TrnTotal])
VALUES
(/*@TrnId,
@OrdrId,*/
(SELECT CURRENT_TIMESTAMP),
@TrnTotal)
if @@ERROR<>0 goto Err_
commit tran
return 0
Err_:
rollback
return 1
enter code here
这个C#代码
private void btnCount_Click(object sender, EventArgs e)
{
string conn = "server=.;uid=sa;pwd=123;database=PharmacyDB;";
SqlConnection con = new SqlConnection();
for (int i = 0; i < dgvSelectedItem.Rows.Count; i++)
{
SqlCommand cmd = new SqlCommand("storedP");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@prdctName", dgvSelectedItem.Rows[i].Cells[0].Value));
cmd.Parameters.Add(new SqlParameter("@ordrdQnty", dgvSelectedItem.Rows[i].Cells[2].Value));
cmd.Parameters.Add(new SqlParameter("@ordrPrice", dgvSelectedItem.Rows[i].Cells[3].Value));
con.ConnectionString = conn;
cmd.Connection = con;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
我有2个表,这个SP应该首先存储OrderProduct表数据,然后填充Transaction表,它们之间的关系是多个订单到一个Transaction ID,但是出现了这个错误:
System.Data.dll中发生了未处理的“System.Data.SqlClient.SqlException”类型异常 附加信息:过程或函数'storedP'需要参数'@TrnDate',这是未提供的。
答案 0 :(得分:1)
评论太长了。问题是你调用存储过程而不是代码本身。存储过程具有以下定义:
ALTER proc [dbo].[StoredProd] (
@prdctName nvarchar(50),
@ordrdQnty int,
@ordrPrice money,
@TrnDate datetime,
@TrnTotal money
) . . .
期待五个参数,其中一个是@TrnDate
(位置上,这应该是第四个)。您似乎没有包含该参数,并且您在存储过程调用本身上收到错误。
编辑:
如果您希望@TrnDate
默认为系统时间,请使用default
:
ALTER proc [dbo].[StoredProd] (
@prdctName nvarchar(50),
@ordrdQnty int,
@ordrPrice money,
@TrnDate datetime default getdate(),
@TrnTotal money
) . . .
如果您不想将其作为参数,请将其完全删除。您可以在存储过程的主体中declare
:
declare @TrnDate datetime = getdate();