0

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

exec dbo.sp_StoredProcedureName 1599800

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

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

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

有没有一种方法可以在不将其作为标准查询运行的情况下做到这一点?如果可能,我想保持一致并将 SqlCommand 构建为 StoredProcedure 类型。

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

4

2 回答 2

1

虽然有一个SQLParameter没有设置名称的构造函数,但如果不SQLParameter设置ParameterName属性,您实际上不能使用 a 。

来自MSDN(重点是我的):

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

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

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

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

exec dbo.sp_StoredProcedureName @myParam = 1599800

从 C# 中,一旦知道参数的名称,就可以按名称添加它:

cmd.Parameters.AddWithValue("@myParam", 1599800);
于 2012-10-31T16:52:55.180 回答
0

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

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

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

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

于 2012-10-31T17:22:20.567 回答