3

リストボックスから選択した複数のアイテムを取得し、SQLクエリに値を渡して、別のテーブルからフィルター処理された値を選択した後、テーブルに値を挿入する関数を作成しています。私が入力したコードは以下のとおりですが、機能していないようです(問題は、文字列をクエリに渡す方法にあります。

string lbSites = "";

protected void Button1_Click1(object sender, EventArgs e)
{
    string cns = "server=abc;database=testDB;Trusted_Connection=True";
    using (SqlConnection con = new SqlConnection(cns))
    {
        using (SqlCommand command = con.CreateCommand())
        {
            command.CommandText = "INSERT INTO Activity (Hostname,Site,Status,System_Dept,Business_Dept)"
                + "SELECT * FROM Inventory WHERE Site IN ("+lbSites+");"
                ; 
            con.Open();
            command.Parameters.AddWithValue("@lbSites", lbSites);
            command.ExecuteNonQuery();
            con.Close();
        }
    }
}

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ListBox1.Items.Count > 0)
    {
        for (int i = 0; i < ListBox1.Items.Count; i++)
        {
            if (ListBox1.Items[i].Selected)
            {
                lbSites += "'" + ListBox1.Items[i].Value + "', ";
            }
        }
    }
}
4

3 に答える 3

3

このような値をSQLに直接渡さないでください。SQLインジェクション攻撃を受ける可能性があります。

代わりに、必要なパラメーターの数を把握し、それらのパラメーターをクエリに挿入できます。

このアプローチは、最大約2,000の値に対して機能します(SQL Serverを想定)。さらに値を渡す必要がある場合は、クエリをサブセットに分割するか、パラメータ値テーブルを使用する必要があります。

例(テストされていないため、いくつかのバグがある可能性があります):

// Get your selected items:
var items = ListBox1.Items.Where(i=>i.Selected).Select(i=>i.Value).ToArray(); 

// Create a series of parameters @param0, @param1, @param2..N for each value.
string paramNames = string.Join(", ", Enumerable.Range(0,items.Count()).Select(e=>"@param"+e)); 

// Build the command text and insert the parameter names. 
string commandText = "INSERT INTO Activity (Hostname,Site,Status,System_Dept,Business_Dept)" 
                + "SELECT * FROM Inventory WHERE Site IN ("+ paramNames +")";

command.CommandText = commandText; 

// Now add your parameter values:  this binds @param0..N to the values selected. 

for(int param=0;param<items.Count();param++)
{
   command.Parameters.AddWithValue("@param" + param, items[param]); 
}
于 2012-05-29T02:02:26.667 に答える
0

の値は、lbSites投稿するたびに失われます。ViewStateに保持します。

また、 SQLにはパラメータcommand.Parameters.AddWithValue("@lbSites", lbSites);がないため、必要ありません。@lbSites

于 2012-05-29T01:54:39.853 に答える
0
try this 
SELECT M.REG_NO, T.TYPE_ID 
    FROM MAIN AS M 
        INNER JOIN CLASSIFICATION AS C 
            ON M.REG_NO = C.REG_NO
        INNER JOIN TYPE AS T 
            ON T.TYPE_ID = C.TYPE_ID
    WHERE (@Types) like .LIKE '%,' +T.TYPE_ID+ ',%'
于 2016-09-28T14:52:54.910 に答える