0

データベースに Web フォームを挿入しているので、パラメーター化されたクエリを使用しています。私はCheckBoxListを持っています。CheckBoxList を反復処理し、チェックされたもの (多対多) ごとに挿入ステートメントを作成し、これをパラメーター化して一度に実行するにはどうすればよいですか?

私は今これを持っています:

string query = "INSERT INTO resources (url, submitted_by, author_name) VALUES (@url, @submitted_by, @author_name);";
foreach (ListItem li in CheckBoxList1.Items)
    {
        if (li.Selected = true)
        {
            query += "; INSERT INTO ";
        }
    }
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.Parameters.AddWithValue("@url", TextBox1.Text);
    cmd.Parameters.AddWithValue("@submitted_by", TextBox2.Text);
    cmd.Parameters.AddWithValue("@author_name", TextBox3.Text);

    try
    {
        conn.Open();
        cmd.ExecuteNonQuery();
        Label1.Text = "Added to database.";
    }

ご覧の通り未完成です。助言がありますか?

4

1 に答える 1

1

LINQ を使用して、コレクション内の各項目に対して一意の名前付きパラメーターを生成し、後で関連する値を追加できます。

var builder = new StringBuilder();
var listParams = CheckBoxList1.Items
                     .Where(li => li.Selected)
                     .Select(li, idx => new 
                     {
                         PhoneString = String.Format("@phone_id{0}", idx),
                         PhoneValue = GetPhoneId(li),
                         ResourceString = String.Format("@resource_id{0}", idx),
                         ResourceValue = GetResourceId(li)
                     };
foreach (var param in listParams)
{
    builder.AppendFormat("INSERT INTO phones_resources (phone_id, resource_id) 
                          VALUES ({0}, {1});", 
                          param.PhoneString, param.ResourceString);
}
SqlCommand cmd = new SqlCommand(builder.ToString(), conn);
foreach (var param in listParams)
{
    cmd.Parameters.AddWithValue(param.PhoneString, param.PhoneValue);
    cmd.Parameters.AddWithValue(param.ResourceString, param.ResourceValue);
}

phone_id, resource_id与えられたものから関連付ける何らかの方法があると仮定しています-プレースホルダー関数 ListItemを配置した場所にそれをプラグインするだけです。Get___

注: a に切り替えましたStringBuilder- 繰り返しで文字列を構築するよりもはるかに優れています+=

于 2010-07-28T21:54:16.403 に答える