2012-11-06 63 views
1

我想传递一个数组到一个方法,然后返回一个字符串,我可以使用SQL的WHERE子句。我有以下,它工作得很好。但是有更好的方法吗?我正在寻找两个结果之一;有没有更好的方法来将数组拆分为字符串

  1. WHERE (ColumnName IN (12, 34, 56, 78, 90))
  2. WHERE (ColumnName IN ('12', '34', '56', '78', '90'))

public static string setInSearchFilter(string psSearchFilter, string psColumnName, 
     string[] paObjectValues, bool pbIsString) 
    { 
     string lsDelimiter = "'", lsRetVal = string.Empty, lsObjectValues = string.Empty; 

     if (!pbIsString) 
     { 
      lsDelimiter = string.Empty; 
     } 

     if (!string.IsNullOrEmpty(psSearchFilter)) 
     { 
      lsRetVal = psSearchFilter + " AND "; 
     } 

     for (int i = 0; i <= paObjectValues.GetUpperBound(0); i++) 
     { 
      lsObjectValues += lsDelimiter + paObjectValues[i] + lsDelimiter; 

      if (i < paObjectValues.GetUpperBound(0)) 
      { 
       lsObjectValues += ", "; 
      } 
     } 

     return lsRetVal += "(" + psColumnName + " IN (" + lsObjectValues + "))"; 
    } 
+3

见的string.join和很多重复。 FWIW:我推荐使用(动态添加的)占位符,因为SQL是SQL。 – 2012-11-06 21:17:14

+4

您是否查看过参数化查询或其他形式的消毒输入?此代码只是乞求SQL注入攻击。 – tmesser

+0

@YYY - 是的,我会做一个参数化查询。试图让这个工作第一。 – ggrewe1959

回答

1

正如评论所说,string.Join

string.Format(
    "({0}" + string.Join("{0},{0}", paObjectValues) + "{0})", 
    lsDelimiter 
); 

这是假设有什么东西在列表中,所以一定要扔掉或返回,如果过滤器设置为空。

你也可以考虑做某种类型的验证上的项目,以防止SQL注入:

if (paObjectValues.Any(item => !int.TryParse(item))) 
    throw new Exception("Items must be numeric"); 
+0

完美!感谢您对问题的编辑。 – ggrewe1959

1

我会为每一个选项添加参数(允许查询计划的再利用和注射安全),或者我会调查了“拆分“UDF。或者,更好的是,我会使用类似ORM或micro-ORM的内容,这些内容通常可能具有此类功能。例如,对于LINQ,您通常可以使用数组/列表和Contains。或者,对于“小巧”,您可以使用IN语法的细微变体,将输入扩展为单独的参数 - 具体如下:where x.Foo in @bar如果“bar”参数有3个值,则变为where x,Foo in (@bar0, @bar1, @bar2)

相关问题