dataGridView批量修改SQl数据很慢很慢,求助

rophie 2011-07-18 03:42:37
现做一个东西,就是在dataGridView里批量修改用户选中的行在数据库中得值,三千多条数据要十几分钟,为什么会那么慢,select和insert只要几秒钟而已。我是用循环的方法来修改的,忘大侠指教,帮忙解决看下哪得问题或者有没有好的方法,万分紧急万分感谢!
 private void 当前制作人ToolStripMenuItem_Click(object sender, EventArgs e)
{
progressBar1.Maximum = dataGridView1.RowCount;
progressBar1.Visible = true;
Cursor = Cursors.WaitCursor;
if (dataGridView1.SelectedRows.Count <= 0)
{
Cursor = Cursors.Default;
MessageBox.Show("请先选择要批量修改的整行!");
return;
}
else
{
int times = 0;
for (int i = 0; i < dataGridView1.RowCount; i++)
{
if (dataGridView1.Rows[i].Selected == true)
{
SqlDataset.SqlCommand("update 生产表 set 当前制作人=@当前制作人 where ID=@ID", new SqlParameter("ID", dataGridView1.Rows[i].Cells[0].Value.ToString().Trim()), new SqlParameter("当前制作人", textBox2.Text.Trim()));
dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
times++;
}
progressBar1.PerformStep();
}
progressBar1.Visible = false;
MessageBox.Show("成功修改了" + times.ToString() + "行制作人!");
}
Cursor = Cursors.Default;
}


超级慢……
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rophie 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 evilant 的回复:]

强烈建议lz把要更新的sql语句整合成一条去操作。
[/Quote]
感谢你的热心,我现在已经解决了,谢谢
aXen 2011-07-19
  • 打赏
  • 举报
回复
强烈建议lz把要更新的sql语句整合成一条去操作。
LAOC 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qqamoon 的回复:]

死脑经了吧

为什么一定要手动更新 DataGridView 呢

你一次更新完,重新绑定一次试试。速度提高 N 倍
[/Quote]

+1
F546445693 2011-07-18
  • 打赏
  • 举报
回复
1.数据库执行最好别这么执行,你可以获取主键集合,在最后进行统一执行;
2.用线程试试,可以快点。
龍过鸡年 2011-07-18
  • 打赏
  • 举报
回复
死脑经了吧

为什么一定要手动更新 DataGridView 呢

你一次更新完,重新绑定一次试试。速度提高 N 倍
rophie 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qqamoon 的回复:]

楼主概念不清啊~!

1、dataGridView1.SelectedRows.Count 是不可能小于零

2、直接用 foreach 循环就可以
如果 dataGridView1.SelectedRows == null 是不会执行 foreach 循环的

3、建议在 SelectionChanged 事件中使用
button.Enabled = (
……
[/Quote]
dataGridView1.SelectedRows.Count 小于零是为了防止用户一行都没有选
你说的方法也可以,但是现在最大的问题就是给datagridview单元格赋值上会极大的影响速度,去掉这个的话速度就会快N倍。
学习了!感谢!
龍过鸡年 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 rophie 的回复:]

引用 4 楼 zhou_xuexi 的回复:

应该是这里存在给gridview单元格重新赋值的问题

就是这个原因,可是我不知道为什么给单元格赋值会比直接改数据库还慢
[/Quote]

如果你用的是数据绑定 应该更新的是 table 而不是 datagridview
rophie 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhou_xuexi 的回复:]

应该是这里存在给gridview单元格重新赋值的问题
[/Quote]
就是这个原因,可是我不知道为什么给单元格赋值会比直接改数据库还慢
龍过鸡年 2011-07-18
  • 打赏
  • 举报
回复
楼主概念不清啊~!

1、dataGridView1.SelectedRows.Count 是不可能小于零

2、直接用 foreach 循环就可以
如果 dataGridView1.SelectedRows == null 是不会执行 foreach 循环的

3、建议在 SelectionChanged 事件中使用
button.Enabled = (
dataGridView1.SelectedRows.Count > 0 &&
textBox2.Text.Trim() != "");
来控制执行按钮是否可用

4、然后,你遍历了整个列表,再次判断 row 是否被选中,完全是多余的

5、最后,建议像这样的更新操作可以利用拼接 sql 语句的方法一次完成执行,当然,最有效的办法是数据绑定,然后 Rebind 或重新载入数据即可



// 利用 "UPDATE 生产表 SET 当前制作人={0} WHERE ID IN ({1})" 拼接 sql
// 参数 "{0}" = textBox2.Text.Trim();
// 参数 "{1}" 可以利用 linq 直接获取

// 如果 ID 是字符型数据
// 使用 string.Format("'{0}'", row.Cells["ID"]

string sql =
string.Format("UPDATE 生产表 SET 当前制作人={0} WHERE ID IN ({1})",
textBox2.Text.Trim(),
string.Join(",", dataGridView1.SelectedRows
.Cast<System.Windows.Forms.DataGridViewRow>()
.Select(row => string.Format("{0}", row.Cells["ID"])).ToArray()));

Console.WriteLine( sql );

zhou_xuexi 2011-07-18
  • 打赏
  • 举报
回复
应该是这里存在给gridview单元格重新赋值的问题
pm_854537719 2011-07-18
  • 打赏
  • 举报
回复
用事件获得修改的行和列,然后对这行的数据进行Update
rophie 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zxh198841 的回复:]

加个事件来判断下,是哪行进行了修改,然后写语句,具体我在DataGridView中没有试过,但是比你循环应该快点
[/Quote]
感谢你的回复,我找到问题出在哪了
问题就是出现在 dataGridView1.Rows[i].Cells[4].Value = textBox2.Text.Trim();
设置 dataGridView的值的问题,三千多行如果加上这句就会极其缓慢,如果注释掉就秒刷,这是问什么呢
zxh198841 2011-07-18
  • 打赏
  • 举报
回复
加个事件来判断下,是哪行进行了修改,然后写语句,具体我在DataGridView中没有试过,但是比你循环应该快点

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧