为每个复选框列表选择单独插入插入。

时间:2012-12-04 23:04:28

标签: c# asp.net sql-server checkboxlist

我有一个表单,用户选择要使用某些信息设置的行。我希望用户能够选择他们需要的所有行,然后为每个选择执行单独的insert语句作为参数的值。例如,用户选择第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();
        }

使用上述逻辑还有一件事我得到两个插件,它只适用于一个选择。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分: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确保连接在我完成后立即处理(关闭)(即使在例外的情况下)。这比使用“全局”连接(i hope it is not static)更好。在ASP.NET中更是如此。

答案 1 :(得分:0)

最好使用批量插入而不是插入每条记录。

我会在这里发给你代码。

创建一个数据表说dtDetail,它在t_ap_line_setup表中具有相同的字段。 循环遍历checkboxlist并使用值填充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 server trip。提高生产力。