代码之家  ›  专栏  ›  技术社区  ›  Davide Vitali

无法将参数传递给存储过程:未提供参数

  •  2
  • Davide Vitali  · 技术社区  · 6 年前

    我有一个Winform桌面应用程序,用于打印机色调清单。数据库位于远程SQL服务器上,仅由两个用于订单和交货的表组成,库存量只是通过跟踪订单和交货的时间来计算的。再加上一堆有制造商、型号、类别等的表格。

    我有一个用于向orders表提供数据的存储过程:

    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;
        }
    }
    

    我总是犯错误

    过程或函数“spinsertcarco”需要参数“@marca”, 没有提供。

    但我真的不知道这是从哪里来的。在调试过程中,我可以看到所有变量都已设置,当在ssms上手动操作时,存储过程可以通过

    EXEC spINSERTCARICO 'OLIVETTI','B0987',1,'_MYPIDN','PROVA'

    问题在哪里?

    谢谢, 戴维德。

    4 回复  |  直到 6 年前
        1
  •  3
  •   user1672994    6 年前

    的默认值 CommandType 是文本。所以 SqlCommand 对象将提供的SP名称视为命令文本,直到 StoredProcedure .所以设定 命令类型 作为 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;
       }
    }
    
        2
  •  0
  •   EzLo tumao kaixin    6 年前

    请执行以下两项更改:

    cmd.CommandType = CommandType.StoredProcedure; // tell that's an SP
    
    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.ExecuteNonQuery(); // don't expect any return value
    
        3
  •  0
  •   Stephen    6 年前

    我最好的猜测是确保

    _玛卡

    不为空并添加

    cmd.commandType=commandType.storedProcedure;

    就在using语句下面,不要期望返回值, 像这样

     using (SqlCommand cmd = new SqlCommand("spINSERTCARICO", connection))
        {
            cmd.CommandType = CommandType.StoredProcedure; //Add this
    
            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;
    
            if(cmd.ExecuteNonQuery() > 0){
              //Change to this
              }
        }
    
        4
  •  0
  •   Prateek Sharma    6 年前

    请尝试下面的代码-

    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;
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return 0;
        }
    }
    

    似乎您没有提供命令类型。