【问题标题】:Fire separate insert for each checkboxlist selection.为每个复选框列表选择触发单独的插入。
【发布时间】:2012-12-04 23:04:28
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用循环:

    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 ​​'System.Web.UI.WebControls.ListItemCollection' 不包含 'Cast' 的定义和最佳扩展方法重载
    • 如果您在 .NET 2 上使用简单的循环替换 Linq 查询(如原始代码中所示)。但也许你只需要添加using System.Linq;
    • 有没有办法在不使用强制转换的情况下获取值?
    • 是的,只需像上面那样使用循环。
    【解决方案2】:

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

    我会把代码发给你。

    创建一个数据表,例如 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的跳闸,提高了生产力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2012-06-01
      • 2020-11-28
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多