我编写了一个查询解析器,它应该创建一个SqlCommand并执行一个存储过程。存储过程的查询可以有多种形式,包括这一个:
exec dbo.sp_StoredProcedureName 1599800
在这种情况下,我以这种方式创建SqlParameter:
var param = new SqlParameter() { Value = paramValue };
我收到一条错误,指出'@ Parameter1'不是过程sp_StoredProcedureName的参数。
有没有办法可以在不将其作为标准查询运行的情况下执行此操作?我想保持一致,并尽可能将SqlCommand构建为StoredProcedure类型。
我想也许我可以先反映存储过程的参数名称,但想知道是否有另一种方法。
答案 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中编写查询时常犯的错误