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

时间:2012-02-03 19:26:38

标签: 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):错误[42000]   [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]过程或函数   'spGET_Detail'需要参数'@DetailCategoryID',而不是   提供。\ r \ n at   System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle,   RetCode retcode)\ r \ n at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   behavior,String方法,Boolean needReader,Object [] methodArguments,   SQL_API odbcApiMethod)\ r \ n at   System.Data.Odbc.OdbcCommand.ExecuteReaderObject(的CommandBehavior   behavior,String方法,Boolean needReader)\ r \ n at   System.Data.Odbc.OdbcCommand.ExecuteReader(的CommandBehavior   行为)\ r \ n在System.Data.Odbc.OdbcCommand.ExecuteReader()\ r \ n中   在DataAccess.OpenReader()中   C:\开发\ DetailRetrieval \ DetailRetrieval \类\ DataAccess.cs:行   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

我非常感谢任何人提供的任何帮助。

谢谢

3 个答案:

答案 0 :(得分:3)

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

  

程序或函数'spGET_Detail'需要参数' @DetailCategoryID ',

但是你说

  

ParmName = @DetailID

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

来自:http://msdn.microsoft.com/en-us/library/bbw6zyha.aspx

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

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

答案 1 :(得分:2)

使用此:

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

答案 2 :(得分:0)

我遇到了同样的问题 - 例外情况说参数不存在,无论参数名称中是否有'@'。

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

DB_Comm.CommandType = CommandType.StoredProcedure;

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