将 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 c# 中添加列和行

如何将 dataGridView 预定义列与 sql 语句中的列绑定(不添加新列)?

将行号列添加到绑定到 DataTable 的 DataGridView

如何将项目添加到 DataGridView ComboBoxColumn?

无法将 DataGridViewComboBoxColumn 中的值设置为绑定的 DataGridView

如何从编码中将复选框添加到datagridview