C# 为每个复选框列表选择触发单独的插入。

C# 为每个复选框列表选择触发单独的插入。,c#,asp.net,sql-server,checkboxlist,C#,Asp.net,Sql Server,Checkboxlist,我有一个表单,用户可以用一些信息选择要设置的行。我希望用户能够选择他们需要的所有行,然后为每个选择执行单独的insert语句作为参数值。例如,用户选择第2、3和25行。我需要触发insert语句3次,每次都将@line参数更改为所选的下一行。我该怎么做?这就是我所能做到的 protected void btn_test_Click(object sender, EventArgs e) { SqlCommand cmd = new Sql

我有一个表单,用户可以用一些信息选择要设置的行。我希望用户能够选择他们需要的所有行,然后为每个选择执行单独的insert语句作为参数值。例如,用户选择第2、3和25行。我需要触发insert语句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();
        }
受保护的无效btn\u测试\u单击(对象发送方,事件参数e)
{
SqlCommand cmd=新的SqlCommand();
cmd.CommandText=“插入t_ap_line_设置(line,date)值(@line,getdate())”;
//字符串strLines=“”;
//cmd.Parameters.Add(“@line”,SqlDbType.Int).Value=Convert.ToInt32(strLines);
cmd.Connection=this.sqlConnection1;
this.sqlConnection1.Open();
对于(int i=0;i
使用上面的逻辑还有一件事,我得到了两个插入,它只适用于一个选择。有人能给我指出正确的方向吗

您可以使用循环:

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();
    }
}
var selectedLines=CheckBoxList1.Items.Cast()
.Where(li=>li.Selected)
.Select(li=>li.Text);
使用(var con=newsqlconnection(connectionString))
使用(var cmd=new SqlCommand(“插入t_ap_line_setup(line,date))值(@line,getdate())”,con))
{
con.Open();
foreach(选定行中的字符串行)
{
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue(“@line”,int.Parse(line));
cmd.ExecuteNonQuery();
}
}

请注意,我使用了
using语句
,以确保连接一完成就被释放(关闭)(即使在异常情况下)。这比使用“全局”连接(尤其是在ASP.NET中)要好。

最好使用大容量插入,而不是插入每个记录

我会在这里给你发代码

创建一个数据表,如dtDetail,它在t\U ap\U line\U设置表中具有相同的字段。 循环检查复选框列表并用值填充dtDetail DATABLE

// 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。提高生产效率。

我遇到了以下错误:错误1“System.Web.UI.WebControl.ListItemCollection”不包含“Cast”的定义,如果您在.NET 2上,请使用简单的循环替换Linq查询(如原始代码中所示)。但也许您只需要使用System.Linq;
添加
。有没有一种方法可以在不使用强制转换的情况下获取值?是的,只需像上面那样使用循环即可。