2012-11-06 72 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)

相關問題