c# - 无法识别发送到 SQL Server 存储过程的参数

标签 c# .net sql-server

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

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

System.Data.Odbc.OdbcException (0x80131937): ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Procedure or function 'spGET_Detail' expects parameter '@DetailCategoryID', which was not supplied.\r\n at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)\r\n at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)\r\n at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)\r\n at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Odbc.OdbcCommand.ExecuteReader()\r\n
at DataAccess.OpenReader() in 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

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

谢谢

最佳答案

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

Procedure or function 'spGET_Detail' expects parameter '@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。

关于c# - 无法识别发送到 SQL Server 存储过程的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9134343/

相关文章:

c# - 将参数发布到 api 主体返回错误 403

c# - 找不到类型或命名空间 "RestSharp"和 "System"

.net - IF/ELSE 语句顺序的最佳实践

mysql - Entity Framework 数据库首先使用 MySQL 和 MS SQL

sql - 为什么这个窗口表达式不会导致被零除错误?

c# - 返回 hh 中大于 24 小时的时间 :mm:ss format in SQL server 2008

C# 登录表单、登录按钮、安全

c# - 在 Node.js/服务器端 javascript 中使用 .NET DLL

c# - 在 TabControl 内恢复 SplitterDistance 不一致

c# - 如何唤醒 C# 中休眠的线程?