我有一个用于打印机碳粉库存的 WinForm 桌面应用程序。该数据库位于远程 SQL Server 上,仅由两个订单和交货表组成,仅通过跟踪订单和交货时间来计算库存数量。再加上一堆包含制造商、型号、类别等的表格。
我有这个存储过程用于输入订单表:
CREATE PROCEDURE [dbo].[spINSERTCARICO] (
@MARCA VARCHAR(25),
@MODELLO VARCHAR(25),
@QTA INT,
@OPERATORE CHAR(7),
@CAUSALE VARCHAR(255))
AS
DECLARE @MODELLOESATTO VARCHAR(25)
SELECT @MODELLOESATTO = Modello FROM Modelli WHERE Modello = @MODELLO AND Marca = @MARCA
INSERT INTO Carico
(Modello
,Qta
,DataCarico
,Operatore
,Note)
VALUES
(@MODELLOESATTO
,@QTA
,GETDATE()
,@OPERATORE
,@CAUSALE)
正在从此方法执行:
public static int InsertCarico(string _marca, string _modello, string _causale, int _qta)
{
int insert = 0;
try
{
if (connection.State == ConnectionState.Closed) connection.Open();
using (SqlCommand cmd = new SqlCommand("spINSERTCARICO", connection))
{
cmd.Parameters.Add("@MARCA", SqlDbType.VarChar).Value = _marca;
cmd.Parameters.Add("@MODELLO", SqlDbType.VarChar).Value = _modello;
cmd.Parameters.Add("@QTA", SqlDbType.Int).Value = _qta;
cmd.Parameters.Add("@OPERATORE", SqlDbType.VarChar).Value = System.Environment.UserName;
cmd.Parameters.Add("@CAUSALE", SqlDbType.VarChar).Value = _causale;
cmd.ExecuteScalar();
}
return insert;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}
我总是收到错误
Procedure or function 'spINSERTCARICO' expects parameter '@MARCA', which was not supplied.
但我真的不明白这是从哪里来的。在调试时,我可以看到变量都已设置,并且在 SSMS 上手动时,存储过程可以正常工作
EXEC spINSERTCARICO 'OLIVETTI','B0987',1,'_MYPIDN','PROVA'
问题出在哪里?
谢谢, 达维德。
最佳答案
CommandType
的默认值为 Text。因此, SqlCommand
对象将提供的 SP 名称视为命令文本,直到您不将其指定给 StoredProcedure
。因此将 CommandType
设置为 cmd.CommandType = CommandType.StoredProcedure
;
public static int InsertCarico(string _marca, string _modello, string _causale, int _qta)
{
int insert = 0;
try
{
if (connection.State == ConnectionState.Closed) connection.Open();
using (SqlCommand cmd = new SqlCommand("spINSERTCARICO", connection))
{
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@MARCA", SqlDbType.VarChar).Value = _marca;
cmd.Parameters.Add("@MODELLO", SqlDbType.VarChar).Value = _modello;
cmd.Parameters.Add("@QTA", SqlDbType.Int).Value = _qta;
cmd.Parameters.Add("@OPERATORE", SqlDbType.VarChar).Value = System.Environment.UserName;
cmd.Parameters.Add("@CAUSALE", SqlDbType.VarChar).Value = _causale;
insert = cmd.ExecuteScalar();
}
return insert;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return 0;
}
}
关于c# - 无法将参数传递给存储过程: parameters not supplied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51151460/