正在将数据从datagridview保存到SQL Server数据库

本文关键字:SQL Server 数据库 保存 datagridview 数据 | 更新日期: 2023-09-27 18:19:56

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

如何将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();
            }
        }
    }
}

正在将数据从datagridview保存到SQL Server数据库

有一些你没有在最初的问题中输入的信息会很好:

  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%确定你是否可以将值重新分配给现有命令的参数(很可能你可以,但…)

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

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

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

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

要么您应该为每个迭代打开一个连接,要么您应该了解如何只使用连接来完成所有工作。

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();
}
  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()

}
}

试试看。它应该工作