【问题标题】:Parameter sent to SQL Server stored procedure not recognized无法识别发送到 SQL Server 存储过程的参数
【发布时间】:2015-01-30 01:20:20
【问题描述】:

我在 Visual Studio 2010 中使用 C# 并连接到 SQL Server 2008 数据库。我正在调用一个存储过程并将其传递给一个参数。我收到以下错误消息。

我检查了正在传递的参数,名称和值是否正确并且连接已打开,存储过程名称也正确。如果我为参数设置默认值,它会返回相应的行。在错误消息下方,我放置了正在执行的代码。传递给Parameters.AddWithValue 的值为ParmName = @DetailCategoryIDParmValue = 2。当我使用 Visual Web Developer 2008 Express Edition 执行完全相同的代码时,它可以完美运行。

System.Data.Odbc.OdbcException (0x80131937): 错误 [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]过程或函数 “spGET_Detail”需要参数“@DetailCategoryID”,而这不是 提供。\r\n 在 System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode 重新编码)\r\n 在 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior 行为,字符串方法,布尔需要读取器,对象[] 方法参数, SQL_API odbcApiMethod)\r\n 在 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior 行为、字符串方法、布尔需要读取器)\r\n at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior 行为)\r\n 在 System.Data.Odbc.OdbcCommand.ExecuteReader()\r\n
在 DataAccess.OpenReader() 中 C:\Development\DetailRetrieval\DetailRetrieval\Classes\DataAccess.cs:line 第1252章

代码

this.DB_Comm.Parameters.AddWithValue(ParmName, ParmValue);

存储过程:

ALTER PROCEDURE spGET_Detail
    @DetailCategoryID smallint
AS
BEGIN
    SET NOCOUNT ON;

    SELECT F.* FROM dbo.tbDetail_MSTR AS F
    WHERE (F.DetailCategoryID = @DetailCategoryID)
    ORDER BY [F].[Description]
END
GO

如果有人能提供任何帮助,我将不胜感激。

谢谢

【问题讨论】:

  • 所以ParmName = @DetailIDparameter '@DetailCategoryID' 是预期的,但你是说名字没问题?
  • 您能否包括您的调用代码而不仅仅是 sp 定义?那会很有帮助。
  • 嗨 BenR,这里是调用代码 -> DA.StoredProcedure = _StoredProc; DA.ParametersClear(); // 加载参数 foreach (string o in _Parms) { DA.ParametersAdd(o, _ParmVals[p]); p++; } if (DA.OpenReader()) public bool ParametersAdd(string IN_ParmName, object IN_ParmValue) { bool Ret = true;试试 { this.DB_Comm.Parameters.AddWithValue(IN_ParmName, IN_ParmValue); } catch(Exception ex) { this.Except = ex.ToString();雷特=假; } 返回 }

标签: c# .net sql-server


【解决方案1】:

该错误为您提供了您需要的所有信息:

过程或函数“spGET_Detail”需要参数“@DetailCategoryID”,

但是你说

ParmName = @DetailID

编辑:我刚刚意识到您正在使用 ODBC 驱动程序连接到 SQL 服务器。 ODBC 驱动程序使用问号作为参数占位符,而不是命名参数。所以你的查询不应该有@anything。参数是根据顺序而不是名称替换的。

发件人:http://msdn.microsoft.com/en-us/library/bbw6zyha.aspx

参数占位符的语法取决于数据源。此示例显示 SQL Server 数据源的占位符。对 System.Data.OleDb 和 System.Data.Odbc 参数使用问号 (?) 占位符。

也就是说,除非您要连接到许多其他数据库类型,否则您可能应该使用 SqlClient,而不是 ODBC。

【讨论】:

  • 那是我打错了。参数名称和我传递的内容是正确的。它应该是@DetailCategoryID。对此感到抱歉。
【解决方案2】:

使用这个:

his.DB_Comm.Parameters.AddWithValue("DetailCategoryID", 2);

【讨论】:

  • 这个。基本上听起来OP将@符号作为参数名称的一部分传递。你不需要这样做。
  • 嗨,克里斯,我尝试在不带“@”的情况下传递参数并得到相同的结果。
  • 嗨 BenR,这里是调用代码 -> DA.StoredProcedure = _StoredProc; DA.ParametersClear(); // 加载参数 foreach (string o in _Parms) { DA.ParametersAdd(o, _ParmVals[p]); p++; } if (DA.OpenReader()) public bool ParametersAdd(string IN_ParmName, object IN_ParmValue) { bool Ret = true;试试 { this.DB_Comm.Parameters.AddWithValue(IN_ParmName, IN_ParmValue); } catch(Exception ex) { this.Except = ex.ToString();雷特=假; } 返回 }
【解决方案3】:

我遇到了同样的问题 - 异常表示参数不存在,无论参数名称中是否包含“@”。

我通过将SqlCommand对象的命令类型设置为StoredProcedure来解决:

DB_Comm.CommandType = CommandType.StoredProcedure;

PS - 使用此方法的参数名称中是否有 @ 无关紧要。我测试了一些 @parameters 和其他没有在同一个 sproc 调用中,它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多