【问题标题】:SqlCommand Error Procedure or function 'X' expects parameter '@Y'SqlCommand 错误过程或函数“X”需要参数“@Y”
【发布时间】:2018-01-05 16:31:38
【问题描述】:

据我所知,这不是一个重复的问题,因为我提供了一个实际可行的替代方案。针对 .NET 4.5 的 VS 2012

常用代码:

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

这行得通,但很杂乱。这也证明我尝试执行的存储过程或正在建立的连接没有某种拼写错误或问题。

  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”,但未提供。

【问题讨论】:

  • 当它不起作用时,你正在执行的SQL字符串是什么?
  • 此失败最常见的原因是当参数值为空时;你确定这里不是这样吗?我们是否可以从头到尾看到一个完整的可运行的东西,它创建、填充参数并执行它?另外:_SqlCmd 是否共享?
  • 您是否对许多命令重复使用相同的 _SqlCmd 变量?如果您这样做(不好),您是否在重用之间清除参数列表?
  • 明确地说,虽然我认为您意识到这一点:在任何情况下都不要使用 string.Format 版本:)
  • 我注意到您的工作示例使用 NVarChar,但非工作示例使用 VarChar。存储过程中的类型是如何定义的?

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


【解决方案1】:

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

我认为这不是强制性的,结果是在最终查询文本中出现双 @。

像这样:

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

【讨论】:

  • SqlClient 实际上并不关心您是否在名称中使用参数 @ 前缀,只要您始终如一地这样做(在这种情况下通过常量)
【解决方案2】:

没有什么比带着一点公开羞辱开始一周的事了……问题是我错误地初始化了 SqlAdapter。

这不适用于 CommandType.StoredProcedure SqlCommand(原因很明显):

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

效果很好:

_SqlAdapt = new SqlDataAdapter(_SqlCmd);

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

调试 101:问题通常出在您没有查看的代码上。

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 2011-02-16
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多