下面是我编写的代码,只保存数据库中的第一行值,但是当我尝试保存多行值时,它会出错。我不知道如何在这段代码中使用循环以及在何处使用循环在数据库中一次插入多行。
如何将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();
}
}
}
}
答案 0 :(得分:3)
如果你没有提出原始问题,那么有些信息会很好:
cs
很可能是SqlConnection
,因为你说它插入了一行,我猜它是一个全局(类级别)变量,并在其他地方创建。我会做一些不同的事情(请参阅我的代码示例,原因)。
你得到了什么错误?基于问题描述,我敢打赌它是一个封闭的连接(因为你在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
和SqlConnection
对象使用SqlCommand
块。使用块可确保在退出使用块时正确清理资源 - 这样您就不必担心何时调用conn.Close()
,因为using
块会照顾对你而言。
另外,我在方法中创建了SqlConnection
。在这种情况下,connectionString
将是一个字符串变量(在类级别,因此所有需要它的方法都可以访问它)持有连接字符串。
最后,我在if块中创建SqlCommand
,只有在!row.IsNewRow
表达式求值为true时才会输入。我不是100%确定你可以将值重新分配给现有命令的参数(很可能你可以,但是......)
我还建议包括一些错误处理,以防插件出现问题。
希望这可以解决您遇到的问题。如果没有,请提供更多细节,以便我们更好地为您提供帮助。快乐的编码!
答案 1 :(得分:0)
问题是cs关闭的次数比打开次数多。
打开连接,插入,然后尝试关闭每次迭代。
您应该为每次迭代打开一个连接,或者您应该看到如何仅使用连接来完成所有操作。
答案 2 :(得分:0)
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();
}
答案 3 :(得分:-1)
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()
}
}
试试这个并看看。它应该工作