【问题标题】:Update MS Access db in C# best way以 C# 最佳方式更新 MS Access db
【发布时间】:2012-06-19 07:00:17
【问题描述】:

我的更新代码:

 for (int i = this.MedaxilGridView1.CurrentCell.RowIndex; i < this.MedaxilGridView1.RowCount; i++)
 {
     // KartsifarishiGridView-dən id götürüb ona uyğun sorğumuzu yazırıq.
     sqlSorgu = "UPDATE customer set medaxil_status = '0' WHERE id = " + 
                 this.MedaxilGridView1.Rows[i].Cells["id"].Value;
     //Sorğunu icra edirk.
     Program.esas.sqlSorguCommand.CommandText = sqlSorgu;
     Program.esas.sqlSorguCommand.Connection = Program.esas.bazayaQosul;
     Program.esas.sqlSorguCommand.ExecuteNonQuery();
     MedaxilGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Empty;

 }

行数:18286

这个版本需要 5 分钟

如何让它更快?

【问题讨论】:

  • 如何提取 id 进行操作?
  • 你的意思是你必须用 medaxil_status = '0' 更新所有行?
  • 您可以尝试使用存储过程。它会工作得更快一些。在此之前,您可以尝试使用一些实际值执行单个查询“UPDATE customer set medaxil_status = '0' WHERE id =” + this.MedaxilGridView1.Rows[i].Cells["id"].Value;" 并检查多长时间它需要。这将帮助您了解哪个部分花费了太多时间。循环或 sql 本身。
  • 您还应该查看参数化查询,以确保您的代码不会受到 sql-injection 的影响。

标签: c# sql database performance ms-access


【解决方案1】:

您应该考虑使用哪个查询来提取 id 并将其直接用于更新,因此您调用数据库一次:

"UPDATE customer set medaxil_status = '0' WHERE id in (select xxx xxx xxx)"

如果您想更新所有行,只需删除 where 子句并调用语句仅一次。 如果您只有一个 id 列表,也许使用一直使用 IN 子句对调用进行分块会减少查询数量,并有望减少整体执行时间。

【讨论】:

  • @Ozgur Dogus Abi bir misal koy bakim
  • 所有行间不。选定行 - 最后一行
【解决方案2】:

您可以为此使用BeginExecuteNonQuery,通过打开一个连接并批量执行所有查询,这将为您节省连接启动开销。

可以在here找到来自 MSDN 的完整示例

另外,我建议你开始使用SQL Parameters

【讨论】:

  • @FelicePollano 是的,你可以。我只想0
【解决方案3】:

您是否尝试将循环包含在 Transaction 中?这加快了 MS Access 更新操作。

看看这个示例here,它展示了如何在 C# 中使用 MS Access Transaction

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多