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