【问题标题】:Parse sql parameters from commandtext从命令文本中解析 sql 参数
【发布时间】:2014-04-01 01:14:00
【问题描述】:

是否可以从纯命令文本中解析 sql 参数?

例如

//cmdtext = SELECT * FROM AdWorks.Countries WHERE id = @id
SqlCommand sqlc = new SqlCommand(cmdtext);
SqlParameterCollection parCol = sqlc.Parameters //should contain now 1 paramter called '@id'

【问题讨论】:

标签: c# sql sql-server parameters sqlcommand


【解决方案1】:

如果 SQL Server 可用,最好的选择可能是简单地询问服务器它的想法;服务器内置解析和元数据功能,例如sp_describe_undeclared_parameters

【讨论】:

    【解决方案2】:

    我最终使用了这种扩展方法(因为我认为没有内置函数):

    public static class SqlParExtension
    {
        public static void ParseParameters(this SqlCommand cmd)
        {
            var rxPattern = @"(?<=\= |\=)@\w*";
            foreach (System.Text.RegularExpressions.Match item in System.Text.RegularExpressions.Regex.Matches(cmd.CommandText, rxPattern))
            {
                var sqlp = new SqlParameter(item.Value, null);
                cmd.Parameters.Add(sqlp);
            }
        }
    }
    

    用法:

    //cmdtext = SELECT * FROM AdWorks.Countries WHERE id = @id
    SqlCommand sqlc = new SqlCommand(cmdtext);
    sqlc.ParseParameters();
    
    sqlc.Parameters["@id"].Value = value;
    

    【讨论】:

    • 反例是一个注释掉的参数:select /*@NotAParameter*/ 1
    【解决方案3】:

    我必须确定这一点,但我确信您必须将参数范围添加到命令中。就像我说的那样,我将不得不回来,但您可以尝试执行以下操作:

    // Create a collection of parameters with the values that the procedure is expecting in your SQL client.
    SqlParameter[] parameters = { new SqlParameter("@id", qid), 
    new SqlParameter("@otherValue", value) };
    
    // Add teh parameters to the command.
    sqlc.Parameters.AddRange(parameters)
    

    【讨论】:

    • 这正是我试图避免的。我想从查询本身接收参数集合,而不是自己添加。
    • 您收到的查询是您在评论中指定的字符串吗?如果是这样,您可以使用简单的正则表达式来检索以“@”字符开头的值。我不确定这是否是您想要实现的目标。您可以使用此正则表达式从选择语句“@{1}[A-z]+”中获取所有变量
    • 我有一堆查询,我想在其中读取参数,然后迭代,以传递值。更准确地说,是否有内置函数?
    • 我不知道。我会玩一会儿,让你知道我发现了什么
    【解决方案4】:

    非常欢迎您查看我的 VS2015 extension, QueryFirst,它从 .sql 文件生成包装类,直接从您的 sql 中获取参数声明。您需要在请求的 --designTime 部分声明您的参数,然后您会再次找到它们作为 Execute()、GetOne() 或 ExecuteScalar() 方法的输入。这些方法返回具有有意义的属性名称的 POCO。智能感知无处不在,您无需输入一行参数代码、连接代码、命令代码或阅读器代码,还有其他众多优势 :-).

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 2011-03-26
      • 2017-10-12
      • 2013-03-21
      相关资源
      最近更新 更多