如何将c# datagridview选择的单元格值传递给sql查询
本文关键字:值传 sql 查询 单元格 datagridview 选择 | 更新日期: 2023-09-27 17:51:22
我有一个c#形式的数据视图,其中有大量的行。以及带有复选框的选择选项。
如果我使用复选框选择选择10行,我需要将列选择行值传递给SQL查询,以过滤来自另一个表的记录。
下面是我的代码,但它不工作,我不知道如何解决这个问题。
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn1 = new SqlConnection(@"Data Source=.'sqlexpress;Initial Catalog=acc;Integrated Security=True");
SqlCommand cmd1 = new SqlCommand(@"select db.date,db.type,db.refno,db.itmcod,db.qty,db.cuscod, db.cstcod,cus.cusnam INTO ##wec from fstktxn as db INNER JOIN fcustomer as cus on db.cuscod = cus.cuscod where itmcod = "dataGridView1.Rows[j].Cells["title"].Value", ", conn1);
conn1.Open();
cmd1.ExecuteNonQuery();
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn1);
bulkCopy.DestinationTableName = "##tmp1";
conn1.Close();
}
是否有任何解决方案来过滤使用gridview选择的数据?
如果我理解你的需求,你应该这样做。
首先获取datagridview数据。
DataTable data=datfridviewname.DataSource as DataTable;
con.Open();
SqlBulkCopy sbc = new SqlBulkCopy(con);
sbc.DestinationTableName = @"tableName";
sbc.WriteToServer(data);
试着阅读这个如何在SQL中使用参数化查询
它展示了如何安全地在查询中添加变量
我认为你问的是"我如何使用DataGridView
中选定的行来形成in
查询?"。假设这是尝试,您应该将其分为两步:
- 获取(从UI)
in
查询中应该使用的一组值 - 编写并创建
in
查询
第一步可以通过迭代DataGridView
的.Rows
来完成,并检查(假设)您拥有的DataGridViewCheckBoxColumn
的.Checked
值;如果被选中:将过滤器值添加到某个列表中。例如:
List<string> titles = new List<string>();
foreach (GridViewRow row in dataGridView1.Rows)
{
if(row.Cells["CheckBoxColumnName"].Value == true)
{
titles.Add((string)row.Cells["TitleColumnName"].Value);
}
}
第二步更复杂,除非您使用像"dapper"这样的工具来自动化它。如果你使用"dapper",你可以使用:
var rows = connection.Query<YourDataType>("...some query... where someColumn in @titles",
new {titles}).AsList();
和就是。如果没有,则需要手动编写命令,例如:
var sb = new StringBuilder("...the basic query... where someColumn in (");
int index = 0;
var cmd = new SqlCommand(connection); // see also: "using"
foreach(var title in titles) {
if(index != 0) sb.Append(",");
string name = "@title" + index++;
sb.Append(name);
cmd.Parameters.AddWithValue(name, value);
}
sb.Append(")");
cmd.CommandText = sb.ToString();
然后像往常一样执行命令。你可能也需要考虑零的情况;应该是所有行吗?没有行吗?
如果你想获得选中的复选框行,那么使用这个你可以得到它
protected void button1_Click(object sender, EventArgs e)
{
foreach (GridViewRow gvrow in dataGridView1.Rows)
{
CheckBox chk = (CheckBox)gvrow.FindControl("chkSelect");
if (chk != null & chk.Checked)
{
SqlConnection conn1 = new SqlConnection(@"Data Source=.'sqlexpress;Initial Catalog=acc;Integrated Security=True");
SqlCommand cmd1 = new SqlCommand(@"select db.date,db.type,db.refno,db.itmcod,db.qty,db.cuscod, db.cstcod,cus.cusnam INTO ##wec from fstktxn as db INNER JOIN fcustomer as cus on db.cuscod = cus.cuscod where itmcod = "dataGridView1.Cells["title"].Value", ", conn1);
conn1.Open();
cmd1.ExecuteNonQuery();
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn1);
bulkCopy.DestinationTableName = "##tmp1";
conn1.Close();//Do something
}
}
}