我有一个表单,用户选择要使用某些信息设置的行。我希望用户能够选择他们需要的所有行,然后为每个选择执行单独的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();
}
使用上述逻辑还有一件事我得到两个插件,它只适用于一个选择。有人能指出我正确的方向吗?
答案 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。提高生产力。