4

文字列のリストがある場合、つまり。List<String>、次のような SQL ステートメントを生成するにはどうすればよいですか。

SELECT Column1 FROM Table1 WHERE Column1 IN ('String1','String2','String3')

'String1','String2','String3'の内容はどこList<String>ですか?

私はVS2005を使用しているため、LINQなどはありません。

4

9 に答える 9

4

次のバージョンを見てください

    [Test]
    public void Test()
    {
        var list = new List<string> {"String1", "String2", "String3"};
        string values = ArrayToString(list);
        string sql = string.Format("SELECT Column1 FROM Table1 WHERE Column1 IN ( {0} )", values);
    }

    private static string ArrayToString(IEnumerable<string> array)
    {
        var result = new StringBuilder();

        foreach (string element in array)
        {
            if (result.Length > 0)
            {
                result.Append(", ");
            }
            result.Append("'");
            result.Append(element);
            result.Append("'");
        }
        return result.ToString();
    }

結果ステートメントSELECT Column1 FROM Table1 WHERE Column1 IN ( 'String1', 'String2', 'String3' )

于 2012-08-18T10:07:16.463 に答える
0

これまでに提出された他の回答は使用しないでください。明らかな理由もなく、SQLインジェクションが含まれています。

    List<String> strlist = new List<string>();
    strlist.Add("st1");
    strlist.Add("st2");
    strlist.Add("st3");

    var dynamicPart = string.Join(", ",
     Enumerable.Range(0, strlist.Count).Select(i => "@" + i).ToArray());
    for(i = 0 to strlist.Count)
     { /* add parameter to SqlCommand here with name ("@" + i) */ }
    string query = "SELECT Column1 FROM Table1 WHERE Column1 IN (" +
     dynamicPart + ")";

複数の理由でリテラルの代わりにパラメーターを使用してください(それらを調べてください!)。

そして、不器用な連結ループを使用する代わりに、string.Joinそれをすべて実行します。

于 2012-08-18T10:14:38.373 に答える
0
// Assume your list (List<string>) is named "myList"

// Please put the next line in an external string resource...
string selectStatement = "SELECT Column1 FROM Table1 WHERE Column1 IN ({0})";

StringBuilder stringBuilder = new StringBuilder("(");
foreach(string colName in myList)
    stringBuilder.Append(String.Format("'{0}',", colName));
stringBuilder.Append(")");

return String.Format(selectStatement, stringBuilder.ToString().Replace(",)", ")");
于 2012-08-21T10:21:42.903 に答える
0

内部操作であり、SQL インジェクションを心配する必要はないと言ったので、これで目的を達成できます。

string str = "";

foreach(string s in list)
  str += "'" + s.Replace("'", "''") + "',";

str = str.SubString(0, str.Length - 1);

str = "SELECT Column1 FROM Table1 WHERE Column1 IN (" + str + ")";

//str will have your command ready.

私はそれをテストしました。それは完全に機能します。

于 2012-08-18T09:39:18.977 に答える
0
List<string> items = new List<string>();
items.Add("string1");
items.Add("string2");
items.Add("string3");
string AllItems = "";
foreach (string item in items)
{
    AllItems += string.Format("\"{0}\",",item);
}
AllItems = AllItems.TrimEnd(',');
string YourSQLQuery = string.Format("SELECT Column1 FROM Table1 WHERE Column1 IN ({0})", AllItems);
MessageBox.Show(YourSQLQuery);
于 2012-08-18T09:39:40.450 に答える
0

SQL インジェクションを防ぐために取得しないでください。

string sql_list = "";
foreach (string s in lst)
    sql_list+=string.Format("{0},",s.Replace("'","''"));
sql_list = string.Format("({0})",sql_list.substring(0,sql_list.length-2));

それはいくつかを助けるかもしれません、そして文字列ビルダーを使うかどうか。

于 2012-08-18T10:18:30.507 に答える
0
List<string> lst=new List<string>();lst.Add("Hello");lst.Add("Hello World");
string s="";
foreach(string l in lst)s+="\""+l+"\"";
s=Regex.Replace(s,"\"\"","\",\"");

string output="SELECT Column1 FROM Table1 WHERE Column1 ("+s+")";
于 2012-08-18T09:36:48.913 に答える
0

試す :

        List<String> strlist = new List<string>();
        strlist.Add("st1");
        strlist.Add("st2");
        strlist.Add("st3");

        string query = "SELECT Column1 FROM Table1 WHERE Column1 IN (";

        for (int i = 0; i < strlist.Count; i++)
        {
            query += "\'" + strlist[i] + "\'" + (i == strlist.Count - 1 ? "" : ",");
        }

        query += ")";
于 2012-08-18T09:36:57.197 に答える
0

SQLインジェクションを適切に処理するには、より良い答えは、フォームのクエリを作成することです...

select results.* from (
    select pk from table where column=value1 union
    select pk from table where column=value2 union
    select pk from table where column=value3 union
    select pk from table where column=value4 union
    select pk from table where column=value5
) filtered join table as results on filtered.pk = results.pk

そして、よりC#フレンドリーにします

string items_filter = "";
int item_index=0;
OracleParameterCollection parameters = new OracleParameterCollection(); // Not sure what class to use here exactly, but just collect a bunch of stored procedure parameters

foreach (string item in list_of_items) {
    string item_name = string.Format("i_item{0}",item_index);  
    string item_sql = string.Format("select pk from table where column=:{0} union",item_name);
    parameters.Add(new Parameter("item_name",item));
    item_index+=1;  
}
if (items_filter.IsNullOrEmpty()) 
    return;

string sql = String.Format("select results.* from ({0}) filtered join table as results on filtered.pk = results.pk",items_filter);

OracleCommand c = new OracleCommand();
c.command = sql;
c.parameters = parameters;
c.execute();

多かれ少なかれ。

于 2012-08-18T10:34:31.403 に答える