【问题标题】:Saving data from datagridview to SQL Server database将数据从 datagridview 保存到 SQL Server 数据库
【发布时间】:2013-06-25 05:37:55
【问题描述】:

下面是我编写的代码,其中我只在数据库中保存第一行值,但是当我尝试保存多行值时它会出错。我不知道如何在这段代码中使用循环以及在哪里使用循环一次在数据库中插入多行。

如何将 DataGridView 值保存到 SQL Server 数据库中?

private void button1_Click(object sender, EventArgs e)
{
    SqlCommand cmd = new SqlCommand("INSERT INTO datagrid (sr, name, email, tel_no) VALUES(@c1,@c2,@c3,@c4)", cs);
    {
        cmd.Parameters.Add(new SqlParameter("@C1", SqlDbType.VarChar));
        cmd.Parameters.Add(new SqlParameter("@C2", SqlDbType.VarChar));
        cmd.Parameters.Add(new SqlParameter("@C3", SqlDbType.VarChar));
        cmd.Parameters.Add(new SqlParameter("@C4", SqlDbType.VarChar));

        cs.Open();

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            {
                if (!row.IsNewRow)
                {
                    cmd.Parameters["@C1"].Value = row.Cells[0].Value;
                    cmd.Parameters["@C2"].Value = row.Cells[1].Value;
                    cmd.Parameters["@C3"].Value = row.Cells[2].Value;
                    cmd.Parameters["@C4"].Value = row.Cells[3].Value;
                    cmd.ExecuteNonQuery();
                }
                cs.Close();
            }
        }
    }
}

【问题讨论】:

  • 错误是什么?我敢打赌它与关闭的连接有关 - 您在每个代码块的末尾关闭连接,所以它只会保存第一行,无论您有多少行。将 cs.Close(); 移到每个循环之外。
  • 你不需要 foreach 循环。
  • @SaroopTrivedi - 如果 OP 从 DataGridView 保存多行,他们需要某种循环。
  • @Tim: 然后需要将 con.Open() 和 con.Close() 放入 If 条件。因为他试图打开 Con.open 一次并关闭它。
  • @Edper - 现在正在处理这个问题......希望从 OP 那里获得更多信息,但会继续使用现有的信息并希望他们觉得它有帮助。

标签: c# sql winforms


【解决方案1】:

有一些你没有在原始问题中输入的信息会很高兴:

  1. cs 很可能是SqlConnection,既然你说它可以插入一行,我猜它是一个全局(类级别)变量,并且是在其他地方创建的。我会做一些不同的事情(原因请参见我的代码示例)。

  2. 您遇到了什么错误?根据问题描述,我敢打赌它是一个关闭的连接(因为您在 foreach 代码块的末尾关闭它,而您应该在 foreach 代码块之外关闭它)。

    李>

所以,话虽如此,这里有一些可能对你有用的东西:

private void button1_Click(object sender, EventArgs e)
{

    using (SqlConnection conn = new SqlConnection(connectionString))
    {

        cs.Open();

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {

            if (!row.IsNewRow)
            {
                using (SqlCommand cmd = new SqlCommand("INSERT INTO datagrid (sr, name, email, tel_no) VALUES(@c1,@c2,@c3,@c4)", conn))
                {

                    cmd.Parameters.AddWithValue("@C1", row.Cells[0].Value);
                    cmd.Parameters.AddWithValue("@C2", row.Cells[1].Value);
                    cmd.Parameters.AddWithValue("@C3", row.Cells[2].Value);
                    cmd.Parameters.AddWithValue("@C4", row.Cells[3].Value);

                    cmd.ExecuteNonQuery();

                }
            }
        }
    }
}

在上面的示例中,我将using 块用于SqlConnectionSqlCommand 对象。 using 块确保在退出 using 块时正确清理资源 - 这样您就不必担心何时调用 conn.Close() 之类的事情,因为 using 块会为您处理这些.

另外,我在方法中创建了SqlConnection。在这种情况下,connectionString 将是一个字符串变量(在类级别,因此所有需要它的方法都可以访问它)保存连接字符串。

最后,我在 if 块中创建了 SqlCommand,只有在 !row.IsNewRow 表达式的计算结果为 true 时才会输入。我不是 100% 确定您可以将值重新分配给现有命令的参数(很可能可以,但是...)

我还建议包括一些错误处理,以防插入出现问题。

希望这能解决您遇到的问题/问题。如果没有,请提供更多详细信息,以便我们更好地为您提供帮助。编码愉快!

【讨论】:

  • 感谢 tim 您指定 cs.close 的问题,在相同的代码中我更改了连接关闭的位置并且相同的代码正常工作
【解决方案2】:

问题是cs关闭的次数多于打开的次数。

您打开连接,插入,然后尝试关闭每次迭代。

您应该为每次迭代打开一个连接,或者您应该了解如何仅使用连接来完成所有操作。

【讨论】:

    【解决方案3】:
    int ab;
    
     int PIrowss = dataGridView2.Rows.Count;
    
     for (ab = 0; ab < PIrowss; ab++)
    
     {
    
     PiCGetAutID();
    
     purchaeOrder.pcautoid = Catget;
    
     purchaeOrder.ponum = label119.Text;
    
     purchaeOrder.col1 = dataGridView2.Rows[ab].Cells[0].Value.ToString();
    
     purchaeOrder.col2 = dataGridView2.Rows[ab].Cells[1].Value.ToString();
    
     purchaeOrder.col3 = dataGridView2.Rows[ab].Cells[2].Value.ToString();
    
     purchaeOrder.col4 = dataGridView2.Rows[ab].Cells[3].Value.ToString();
    
      purchaeOrder.col5 = dataGridView2.Rows[ab].Cells[4].Value.ToString();
    
    
     purchaeOrder.POcSave();
    
    }
    

    【讨论】:

      【解决方案4】:
        private void button1_Click(object sender, EventArgs e)
              {                  
      SqlConnection conn = new SqlConnection();
      conn.Open();
      
      SqlCommand comm = new SqlCommand();
      comm.Connection = conn;
      
      string sr = null;
      string name = null;
      string email = null;
      string tel_no = null;
      
      
      for (int i = 0; i <= this.DataGridView1.Rows.Count; i++) {
      sr == this.DataGridView1.Rows(i).Cells(0).Value.ToString()
      name == this.DataGridView1.Rows(i).Cells(1).Value.ToString()
      email == this.DataGridView1.Rows(i).Cells(2).Value.ToString()
      tel_no == this.DataGridView1.Rows(i).Cells(3).Value.ToString()
      
       comm.CommandText = "insert into mytable(name,age) values('" & name & "','" & age& "')"
         comm.ExecuteNonQuery()
      
      conn.Close()
      
      
      }
      
      }
      

      试试这个看看。它应该工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        • 2016-12-27
        • 2011-05-02
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多