![](/img/trans.png)
[英]Saving DataGridView data to SQL Server database Winform
[英]Saving data from datagridview to SQL Server database
下面是我只编写了将第一行值保存在数据库中的代码,但是当我尝试保存多个行值时出现错误。 我不知道如何在此代码中使用循环以及在哪里使用循环一次在数据库中插入多行。
如何将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
很可能是SqlConnection
,并且由于您说它可以插入一行,所以我猜它是全局(类级别)变量,并且在其他地方创建。 我会做一些不同的事情(有关原因,请参见我的代码示例)。
你遇到了什么错误? 根据问题描述,我敢打赌它是一个封闭的连接(因为您应该在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();
}
}
}
}
}
在上面的示例中,我对SqlConnection
和SqlCommand
对象使用using
块。 using块可确保在退出using块时正确清理资源-这样,您就不必担心何时调用conn.Close()
类的事情,因为using
块将为您处理这些事情。
另外,我在方法中创建SqlConnection
。 在这种情况下, connectionString
是一个保存连接字符串的字符串变量(在类级别,因此所有需要它的方法都可以访问它)。
最后,我在if块中创建SqlCommand
,仅当!row.IsNewRow
表达式的值为true时才输入该!row.IsNewRow
。 我不确定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()
}
}
试试看,看看。 它应该工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.