0

ユーザーがいくつかの情報を設定する行を選択するフォームがあります。ユーザーが必要なすべての行を選択してから、パラメーターの値として、選択ごとに個別の挿入ステートメントを実行できるようにしたいと思います。たとえば、ユーザーは行2、3、および25を選択します。挿入ステートメントを3回実行する必要があり、そのたびに@lineパラメーターを選択した次の行に変更します。どうすればいいですか?これは私が得た限りです。

        protected void btn_test_Click(object sender, EventArgs e)
        {

            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "Insert into t_ap_line_setup  (line,date) values (@line,getdate())";
            //string strLines = "";

            // cmd.Parameters.Add("@line", SqlDbType.Int).Value = Convert.ToInt32(strLines);

            cmd.Connection = this.sqlConnection1;
            this.sqlConnection1.Open();

            for (int i = 0; i < lines_list.Items.Count; i++)
            {
                if (lines_list.Items[i].Selected)
                {
                    cmd.Parameters.Add("@line", SqlDbType.Int).Value = Convert.ToInt32(lines_list.Items[i].Text);
                    cmd.ExecuteNonQuery();
                }
            }
            this.sqlConnection1.Close();
        }

上記のロジックでもう1つ、2つの挿入があり、1つの選択でのみ機能します。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

0

ループを使用できます。

var selectedLines = CheckBoxList1.Items.Cast<ListItem>()
             .Where(li => li.Selected)
             .Select(li => li.Text);
using (var con = new SqlConnection(connectionString))
using (var cmd = new SqlCommand("Insert into t_ap_line_setup  (line,date) values (@line,getdate())", con))
{
    con.Open();
    foreach (string line in selectedLines)
    {
        cmd.Parameters.Clear();
        cmd.Parameters.AddWithValue("@line", int.Parse(line));
        cmd.ExecuteNonQuery();
    }
}

using-statementを使用して、接続が終了するとすぐに接続が破棄(クローズ)されるようにしていることに注意してください(例外の場合でも)。これは、「グローバル」接続を使用するよりも優れています(静的でないことを願っています)。ASP.NETではなおさらです。

于 2012-12-04T23:17:44.243 に答える
0

各レコードを挿入するのではなく、一括挿入を使用することをお勧めします。

ここにコードをお送りします。

t_ap_line_setupテーブルに同じフィールドを持つdtDetailなどのデータテーブルを1つ作成します。チェックボックスリストをループして、dtDetailデータテーブルに値を入力します。

// Code for bulk insert
if (dtDetail.Rows.Count > 0)
{
    string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    SqlBulkCopy bulk = new SqlBulkCopy(connectionString);
    bulk.DestinationTableName = "t_ap_line_setup";
    bulk.WriteToServer(dtDetail);
}

上記のコードの利点は、SQLサーバーのトリップを減らすことです。生産性が向上します。

于 2012-12-05T08:51:12.057 に答える