【问题标题】:.NET SqlCommand - finding Parameters in inline querys (Regex?).NET SqlCommand - 在内联查询中查找参数(正则表达式?)
【发布时间】:2009-08-16 07:36:57
【问题描述】:

我有一个方法,它使用 sp_sproc_columns 来查找需要为存储过程发送的所有参数。

我的问题是如何为内联 SQL 查询做类似的事情?

我想获取查询期望的参数列表。

实现这一点的唯一方法是使用正则表达式吗?有什么例子吗?


示例:

sql = "SELECT * FROM tbl WHERE id = @id AND name = @name"

我需要一个包含 @id@name 的列表。

【问题讨论】:

    标签: .net sql regex parameters


    【解决方案1】:

    使用正则表达式的方式也不是太难 - 如果你喜欢这样找到你的参数:

       Regex r = new Regex(@"(?<Parameter>@\w*)", RegexOptions.Compiled);
    
       foreach (Match m in r.Matches(sqlStatement))
       {
          if(m.Success)
          {
             string parameterName = m.Value;
          }
       }
    

    但是,这只会为您提供参数 names - 它不可能猜测或确定参数类型或任何其他参数元数据 - 所以最后,这可能是一种快速但可能也是“肮脏”的方式。

    马克

    【讨论】:

    • 为什么脏?我有一个强类型对象,其中包含我需要的所有值,并且每个成员都有一个属性来描述它的 DB 类型。听起来很脏吗?这真的是一种不好的做法吗?
    • 好吧,你只能提取参数的名称,正如 Marc Gravell 正确指出的那样,这个简单的正则表达式可能会被简单的边缘情况所愚弄——但如果它对你的大多数情况都足够好,请享用! ;-)
    【解决方案2】:

    我怀疑您必须完全解析 SQL。它可能比您预期的要复杂,尤其是当您的 SQL 粗鲁到包含以下内容时:

    • 使用命名参数在内部执行存储过程;例如EXEC MyProc @foo = @localArg - 您的查询只需要@localArg
    • 有一个带有'some text @foo more text' 的字符串 - 可能是由于调用了sp_ExecuteSQL@foo 不是您的查询的一部分)

    【讨论】:

    • 我有一个存储过程的解决方案,我使用 sp_sproc_columns。这应该只是简单内联查询的解决方案。
    • 希望“简单查询”不会执行 EXEC,然后... ;-p
    • 那么这真的只是一个正则表达式问题吗?应该是什么表达方式?
    【解决方案3】:

    检查以下代码以获取内联查询中的参数名称:

      Dim SQL As String =  "SELECT * FROM tbl WHERE id = @id AND name = @name"
    
      Dim arr = SQL.Split(" "c)
      For Each str As String In arr
        If str.StartsWith("@") Then
          MessageBox.Show(str)
        End If
      Next
    

    【讨论】:

    • 按空间分割并不可靠;你可以有“(@foo”、“,@foo”、“+@foo”等
    • 是的,你是对的,收集所有的情况并把它放在拆分的char数组中并不容易。
    • @ 也可以合法地作为 SQL 中字符串的一部分出现
    【解决方案4】:

    对于 SQL Server 提供程序,如果您使用的是存储过程,则可以使用 SqlCommandBuilder.DeriveParameters method

    对于其他情况,我一直发现,如果您的命令至少是恒定的,那么最好的方法是使用 Visual Studio 中的设计器支持。要么创建一个强类型的DataSet 并添加一个查询,要么用老式的方式将SqlConnectionSqlCommand 拖到设计图面上。在任何一种情况下,当您将 CommandText 配置为带有参数的语句时,设计器都会询问您是否要填写 Parameters 集合。结果是它会生成代码来创建带有参数集合的 SqlCommand已经创建。您需要做的就是设置参数值,一切就绪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多