没有命名参数的SqlCommand存储过程

时间:2012-10-31 16:46:11

标签: c# sql-server stored-procedures sqlparameters

我编写了一个查询解析器,它应该创建一个SqlCommand并执行一个存储过程。存储过程的查询可以有多种形式,包括这一个:

exec dbo.sp_StoredProcedureName 1599800

在这种情况下,我以这种方式创建SqlParameter:

var param = new SqlParameter() { Value = paramValue };

我收到一条错误,指出'@ Parameter1'不是过程sp_StoredProcedureName的参数。

有没有办法可以在不将其作为标准查询运行的情况下执行此操作?我想保持一致,并尽可能将SqlCommand构建为StoredProcedure类型。

我想也许我可以先反映存储过程的参数名称,但想知道是否有另一种方法。

2 个答案:

答案 0 :(得分:1)

虽然SQLParameter的构造函数没有设置名称,但如果不设置SQLParameter属性,则无法实际使用ParameterName

来自MSDN(强调我的):

  

ParameterName以@paramname形式指定。 你必须设置   在执行依赖的SqlCommand之前的ParameterName   参数

在您的SP中,参数有一个名称,请查看查询的定义以找到它。

如果事先不知道名称是什么,请尝试查询sys.parameters表以找出特定存储过程所需的参数。

最好调用存储过程来指定哪个参数无论如何(特别是如果有多个参数):

exec dbo.sp_StoredProcedureName @myParam = 1599800

从C#开始,一旦知道调用了什么参数,就可以按名称添加它:

cmd.Parameters.AddWithValue("@myParam", 1599800);

答案 1 :(得分:0)

当您创建在问题中指定的类型的命令时,此命令将转换为动态SQL查询,该查询有点类似于以下代码段:

EXECUTE sp_executesql 'exec dbo.sp_storedprocName @FirstParam=value, ...'

这里,@ FirstName是您在将其添加到SqlCommand对象时指定的参数的名称。如果不指定参数名称,则无法创建此类查询。

您可以使用SQL Server探查器查看ADO.NET生成的查询。打开SQL Server探查器并查看如何解释查询是一个很好的做法,因为它有助于避免我们在ADO.NET中编写查询时常犯的错误