c# - 无法将参数传递给存储过程: parameters not supplied

标签 c# .net sql-server stored-procedures

我有一个用于打印机碳粉库存的 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/

相关文章:

c# - 遇到锁时如何停止线程?

c# - 标签从右向左增长

c# - 截断表 C# 找不到表 - 不存在或没有权限

sql-server - 启动时在 VB.NET 应用程序中选择连接字符串

.net - 通过非泛型 IDictionary 枚举时,无法将泛型字典项转换为 DictionaryEntry

c# - 何时添加 gridview 中自动生成的列?

c# - 为什么 object.ToString() 没有反函数?

c# - 复杂列表子项的 ASP.NET MVC 5 编辑选项

c# - EF TPT 生成重复的外键

c# - 使用整数设置枚举属性并验证参数