代码之家  ›  专栏  ›  技术社区  ›  CD..

.NET sqlcommand-在内联查询(regex?)中查找参数

  •  4
  • CD..  · 技术社区  · 15 年前

    我有一个方法 sp_存储过程列 查找需要为存储过程发送的所有参数。

    我的问题是如何对内联SQL查询执行类似的操作?

    我想得到一个查询所期望的参数列表。

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


    例子:

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

    我需要一个包含 @身份证 @名字 .

    4 回复  |  直到 15 年前
        1
  •  2
  •   marc_s    15 年前

    使用正则表达式的方法也不太难——如果您喜欢这样查找参数:

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

    但是,这只会给你参数 姓名 -它不可能猜测或确定参数类型或任何其他参数元数据,所以最后,这可能是一种快速的,但也可能是一种“肮脏”的方法。

    马克

        2
  •  0
  •   Marc Gravell    15 年前

    我怀疑您必须完全解析SQL。这可能比您预期的要复杂,尤其是如果您的SQL足够粗鲁,可以包含以下内容:

    • 使用命名参数在内部执行存储过程;例如 EXEC MyProc @foo = @localArg 这里只有 @localArg 您的查询需要
    • 有一根绳子 'some text @foo more text' 可能是因为打电话 sp_ExecuteSQL ( @foo 不是查询的一部分)
        3
  •  0
  •   Wael Dalloul    15 年前

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

      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
    
        4
  •  0
  •   John Saunders    15 年前

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

    对于其他情况,我总是发现,如果命令至少是常量,那么最好的方法就是在Visual Studio中使用设计器支持。创建强类型 DataSet 然后添加一个查询,或者用传统的方式执行并拖动 SqlConnection SqlCommand 在设计图面上。在这两种情况下,当您将commandText配置为带有参数的语句时,设计器将询问您是否需要 Parameters 已填写集合。结果是,它将生成用于创建已创建参数集合的sqlcommand的代码。您所需要做的就是设置参数值,并且您已经设置好了。