使用对象填充sqlCommand参数 - 潜在问题

时间:2015-06-05 13:42:12

标签: c# regex reflection

我写了一个方法做了以下事情。

它的作用

  • 在参数化SQL查询中解析参数的SqlCommand对象字符串。
  • 排除声明的所有参数和以@@。
  • 开头的参数
  • 使用共享参数名称
  • 的反射查找对象中的属性
  • 使用对象的属性值并将参数添加到 参数集合

反射

此方法旨在用于高度可自定义的Web环境,并从各种或反序列化的JSON对象获取参数。我非常清楚反射速度很慢,但这个想法只是为了反映返回集的单个对象而不是在数据处理循环中使用,反思问题不是我关心的问题。

问题

除了列出反思的缺点之外,我想知道任何人看到这些代码我可能没有考虑过的问题。请假设对象具有正确的属性。我很难测试这个,因为我编写它来解析我所知道的SQL。我不能写SQL的测试我不知道。它似乎通过了我编写的每一个SQL测试。

代码是否有任何问题

  1. 是否存在可能会破坏此问题的潜在疑问?
  2. 可以更有效地编写代码吗?
  3. 您对这个想法有什么其他问题吗?
  4. 代码

    public static void LoadParametersByObject(SqlCommand command, Object obj)
    {
        var DeclareREG = new Regex("(?<=Declare\\s*)@\\w{1,}");// finds all Declare @name
        var ParameterREG = new Regex("(@{1,2}\\w{1,})");//finds all @name and all @@name
        List<String> Exclude = (from Match x in DeclareREG.Matches(command.CommandText) select x.Value.Replace("@", "").ToUpper()).ToList();
        List<String> Include = (from Match x in ParameterREG.Matches(command.CommandText)
                                where !x.Value.StartsWith("@@") && !Exclude.Contains(x.Value.Replace("@", "").ToUpper())
                                select x.Value.Replace("@", "").ToUpper()).Distinct().ToList();
        foreach (PropertyInfo prop in (from x in obj.GetType().GetProperties() where Include.Contains(x.Name.ToUpper()) select x).ToArray())
        {
            command.Parameters.AddWithValue("@" + prop.Name, prop.GetValue(obj));
        }
    }
    

    代码细分

    1. 使用正则表达式查找Declare(空格)@parameter并将其放入 排除清单
    2. 使用正则表达式查找以@或@@开头的任何参数。     抛弃@@,因为它们是内部SQL对象并检查@     参数,以确保它们不在排除列表中     在查询的文本中声明并将结果添加到     包括清单
    3. 迭代包含列表并使用。搜索对象属性 同名
    4. 将属性值添加到SqlCommand的SqlParameter集合
    5. 提前感谢您的帮助

0 个答案:

没有答案