将 DataGridView 中的值添加到 SQL
Posted
技术标签:
【中文标题】将 DataGridView 中的值添加到 SQL【英文标题】:Adding the values from DataGridView to SQL 【发布时间】:2021-05-04 22:55:15 【问题描述】:当我单击添加按钮时没有任何反应。我想将 DGV 的单元格中的值添加到 SQL 表中。
private void add_Click(object sender, EventArgs e)
// USING SQL
SqlConnection con = new SqlConnection(@"Data Source=CANER\SQLEXPRESS;Initial Catalog='Student Automation DB';Integrated Security=True");
for (int i = 0; i < mainTable.Rows.Count; i++)
if (mainTable.Rows[i].Cells[0] != null)
continue;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO students VALUES('" + mainTable.Rows[i - 1].Cells[0].Value + "','" + mainTable.Rows[i - 1].Cells[1].Value + "','" + mainTable.Rows[i - 1].Cells[2].Value + "','" + mainTable.Rows[i - 1].Cells[3].Value + "','" + mainTable.Rows[i - 1].Cells[4].Value + "','" + mainTable.Rows[i - 1].Cells[5].Value +"')";
con.Open();
cmd.ExecuteNonQuery();
con.Close();
【问题讨论】:
您是否知道如果mainTable.Rows[i].Cells[0]
中的值具有值,那么该行将不会写入数据库? ……if (mainTable.Rows[i].Cells[0] != null) continue;
……?所以,如果第一个单元格有一个值并且不是null
,那么不要将该行写入数据库?...你确定不想要if (mainTable.Rows[i].Cells[0] == null) continue;
如果您重视数据库,请使用参数化查询。您对 SQL 注入持开放态度。
【参考方案1】:
当前在发布的代码中,如果 Cells[0]
IS null
,则将该行添加到数据库中。我会假设这是倒退的,将使用 IF Cells[0]
IS NOT null
,然后将该行添加到数据库中。
此外,似乎没有必要在循环的每次迭代中“打开”和“关闭”数据库连接。我用using
语句替换了这个结构,以确保连接正确关闭。
此外,我很确定mainTable.Rows[i].Cells[0]
永远不会是null.
因此,代码永远不会向数据库添加任何行。 mainTable.Rows[i].Cells[0].Value
可能是 null
,但代码从不检查这个。
最后,您应该知道,您的代码对 SQL 注入是开放的。这在几乎所有环境中都是不受欢迎的,因此代码将被拒绝。在大多数情况下,将查询“参数化”是明智的。这是更多的工作/代码;但是,防止恶意用户破坏您的数据库是值得的。通过对参数化查询进行简单的谷歌搜索,有很多这样的例子。如果您在实现参数化查询时遇到问题,请告诉我,我可以添加一个示例。
private void add_Click(object sender, EventArgs e)
// USING SQL
using (SqlConnection con = new SqlConnection(@"Data Source=CANER\SQLEXPRESS;Initial Catalog='Student Automation DB';Integrated Security=True"))
using (SqlCommand cmd = new SqlCommand())
cmd.Connection = con;
con.Open();
for (int i = 0; i < mainTable.Rows.Count; i++)
if (mainTable.Rows[i].Cells[0].Value != null)
cmd.CommandText = "INSERT INTO students VALUES('" + mainTable.Rows[i].Cells[0].Value + "','" + mainTable.Rows[i].Cells[1].Value + "','" + mainTable.Rows[i].Cells[2].Value + "','" + mainTable.Rows[i].Cells[3].Value + "','" + mainTable.Rows[i].Cells[4].Value + "','" + mainTable.Rows[i].Cells[5].Value +"')";
cmd.ExecuteNonQuery();
【讨论】:
您对“null”的看法是正确的。我用TextBox取值解决了这个问题。因此,工作量减少了。非常感谢..【参考方案2】:您是否尝试将列名添加到查询中?比如“INSERT INTO students (column_name1, column_name2...) VALUES ('x','y'...)”?
【讨论】:
为什么要减去 i-1?由于您从 0 开始循环,因此行数应该没有问题。您是否在循环中设置了断点以查看它是否实际工作?也许也可以在 con.Close() 处设置断点并检查“cmd”值。 因为保持循环直到你达到空值。然后读取null之前的值。所以用户输入的值。以上是关于将 DataGridView 中的值添加到 SQL的主要内容,如果未能解决你的问题,请参考以下文章
如何将 dataGridView 预定义列与 sql 语句中的列绑定(不添加新列)?
将行号列添加到绑定到 DataTable 的 DataGridView
如何将项目添加到 DataGridView ComboBoxColumn?