SqlCommand错误过程或函数'X'需要参数'@Y'

时间:2018-01-05 16:31:38

标签: c# sql-server c#-4.0

尽管我可以说,这不是一个重复的问题,因为我提供了一个实际上可行的替代方案。 VS 2012以.NET 4.5为目标

公共代码:

public const string SP_PLANT = "hsp_BOM_EXP_SOURCE";
public const string SP_PARM_PLANT = "@Plant_CD";
public const string SP_PARM_PART_NUM = "@Mtrl_Number";
public const string SP_PARM_INCL_PURCH = "@Extend_BOM_Flag";

_SqlCmd = new SqlCommand(SP_PLANT, _Cnxn);

这是有效的,但是是一个kludge。它也证明我没有遇到某种拼写错误或我正在尝试执行的存储过程或我正在建立的连接的问题。

  string sqlCmd = "";

    sqlCmd = string.Format(
      "EXEC [dbo].[{0}] {1} = N'{2}', {3} = N'{4}', {5} = {6}",
        SP_PLANT, SP_PARM_PLANT, "1234", SP_PARM_PART_NUM,
        PartNum, SP_PARM_INCL_PURCH, (InclPurchased ? 1 : 0));
    _SqlCmd.CommandType = CommandType.Text;
    _SqlCmd.CommandText = sqlCmd;

这不起作用,但应该。

    _SqlCmd.CommandType = CommandType.StoredProcedure;
    _SqlCmd.Parameters.Add(SP_PARM_PLANT, SqlDbType.VarChar, 4);
    _SqlCmd.Parameters.Add(SP_PARM_PART_NUM, SqlDbType.VarChar, 18);
    _SqlCmd.Parameters.Add(SP_PARM_INCL_PURCH, SqlDbType.Bit);

    _SqlCmd.Parameters[SP_PARM_PART_NUM].Value = PartNum;
    _SqlCmd.Parameters[SP_PARM_PLANT].Value = "1234";
    _SqlCmd.Parameters[SP_PARM_INCL_PURCH].Value = (InclPurchased ? 1 : 0);

返回的错误是:过程或函数'hsp_BOM_EXP_SOURCE'需要参数'@Plant_CD',这是未提供的。

2 个答案:

答案 0 :(得分:0)

您是否尝试在参数名称的开头不提供@?

我认为这不是强制性的,导致最终查询文本中的双@。

像这样:

public const string SP_PLANT = "hsp_BOM_EXP_SOURCE";
public const string SP_PARM_PLANT = "Plant_CD";
public const string SP_PARM_PART_NUM = "Mtrl_Number";
public const string SP_PARM_INCL_PURCH = "Extend_BOM_Flag";

答案 1 :(得分:0)

没有什么能像一点点公开羞辱开始休息一周......问题是我错误地初始化了SqlAdapter。

这对CommandType.StoredProcedure SqlCommand不起作用(原因很明显):

_SqlAdapt = new SqlDataAdapter(_SqlCmd.CommandText, _Cnxn);

这很好用:

_SqlAdapt = new SqlDataAdapter(_SqlCmd);

我会注意到,除了使用命令文本初始化之外,实际上会自动为SelectCommand属性创建一个非null的SqlCommand对象。但是SqlCommand上没有任何参数,更不用说我在我的SqlCommand上小心创建的参数了。向所有浪费时间试图帮助我的人道歉 - 尤其是Marc Gravell,他建议我发布一个完整的工作示例。

调试101:问题通常在于你不看的代码。