我在 Visual Studio 2010 中使用 C# 并连接到 SQL Server 2008 数据库。我正在调用一个存储过程并向它传递一个参数。我收到以下错误消息。
我已经检查了传递的参数,名称和值是否正确,连接是否打开,存储过程名称是否正确。如果我为参数设置默认值,它会返回相应的行。在错误消息下方,我放置了正在执行的代码。传递给 Parameters.AddWithValue
的值是 ParmName = @DetailCategoryID
、ParmValue = 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/