1

配列をメソッドに渡してから、SQLWHERE句に使用できる文字列を返そうとしています。私は以下を持っています、そしてそれはうまく働きます。しかし、もっと良い方法はありますか?2つの結果のうちの1つを探しています。

  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 + "))";
    }
4

2 に答える 2

1

すべてのオプションにパラメーターを追加するか(クエリプランの再利用とインジェクションの安全性を許可する)、または「分割された」UDFを調査します。または、ORMやmicro-ORMのようなものを使用すると、このタイプの機能が組み込まれていることがよくあります。たとえば、LINQでは、配列/リストとContainsを使用できることがよくあります。または、「dapper」を使用すると、入力を個別のパラメーターに拡張するIN構文の微妙な変形を使用できます。具体的には、「bar」パラメーターに3つの値がある場合にwhere x.Foo in @barなります。where x,Foo in (@bar0, @bar1, @bar2)

于 2012-11-06T21:25:51.623 に答える
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");
于 2012-11-06T21:26:28.660 に答える