【问题标题】:SqlCommand stored procedure without a named parameter没有命名参数的 SqlCommand 存储过程
【发布时间】:2012-10-31 16:46:10
【问题描述】:

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

exec dbo.sp_StoredProcedureName 1599800

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

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

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

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

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

【问题讨论】:

  • 如果您将Name 属性设置为空字符串?
  • 只是为了确认一下,存储过程的定义中确实有一个参数,对吗?
  • 是的 .. SP 已命名。我当然可以尝试强制执行参数名称要求。但这是一次迁移,我正试图限制对现有行为的更改。

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


【解决方案1】:

虽然SQLParameter 的构造函数没有设置名称,但您实际上不能在不设置ParameterName 属性的情况下使用SQLParameter

来自MSDN(强调我的):

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

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

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

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

exec dbo.sp_StoredProcedureName @myParam = 1599800

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多