DataAdapter.Fill速度太慢

4
我知道DataAdapters存在性能问题,但有没有什么方法可以更快地解决它?目前,DataAdapter.Fill方法在3000条记录上需要5-6秒的时间,这对我的应用程序来说太慢了。如果我删除Fill行并只执行SQL(使用SQLCE),则需要20毫秒,因此我猜测查询不是问题所在。我尝试在datatable上添加BeginLoadData,但对性能没有任何影响。
 using (SqlCeConnection con = new SqlCeConnection(conString))
 {
       con.Open();
       using (SqlCeDataAdapter dAdapter= new SqlCeDataAdapter())
       {

          using (SqlCeCommand com = new SqlCeCommand(query, con))
          {
               com.Parameters.Add("uname", textBox1.Text);
               dAdapter.SelectCommand = com;
               dAdapter.SelectCommand.Connection = con;

               DataTable dTable = new DataTable();


               dAdapter.Fill(dTable);

               dataGridView1.DataSource = dTable;


           }
       }
  }

有更好的方法来填充DataGridView或加快Fill方法吗?


也许是连接速度有问题? - Camron B
你能把声明和填充dTable的代码粘贴在这里吗?如果你正在执行更新、删除或插入等操作,请使用DataReader,速度会更快。 - MethodMan
我已经添加了额外的代码并删除了 BeginLoadData。我将数据库移动到我的本地机器上,以确保它不是连接问题。@DJ Kraze,我认为更新、删除和插入主要是针对数据适配器,而数据读取器则用于只读操作? - Skoder
如果您注释掉 dataGridView1.DataSource = dTable; 这一行,只留下 dAdapter.Fill(dTable);,那么会发生什么?我猜绑定数据到 DGV 可能会很慢,而不是填充表格。 - mj82
@mj82 - 不,我也以为可能是DGV,但如果我删除DataSource,时间仍然相同。肯定是Fill方法导致了延迟。 - Skoder
3个回答

1
你可以将DataGridView绑定到一个DataReader上,但这可能并不会更好,因为将3000行加载到DataGridView中并不快速。

有没有比DGV更好的替代品,可以让用户以类似Excel的方式编辑数据? - Skoder
1
好的,没有免费的午餐。您可以尝试Telerik RadGridView或DevExpress XtraGrid。另一个选项是进行分页。 - Conrad Frix
看一下绑定..我个人会更改那个 DataTable 并使用 Datareader..你知道你也可以将 datagrids 绑定到 List<> 吗?这可能会更快...只是提供信息。 - MethodMan
@DJKraze - DataReader 在这里并没有更快。 - Skoder
1
那么和数据读取器需要一个打开且连接的数据库连接。在绑定到UI时保持它的开放状态没有意义。将记录加载到DTO中,处理完命令后再绑定到UI。 - Jason Meckley

1

核心问题在于一次性为用户加载3000条记录。无论怎样分批加载300条记录,数据量都是问题。在SQL查询中实现分页,允许用户查看子集记录。然后当需要时,用户可以导航到更多的记录。


0

使用BatchUpdate/BatchInsert。确保指定UpdateBatchSize = 3000(您拥有的记录数)

以下是如何执行的示例:BatchInsert


我得到了一个“不支持的异常”。 我使用的是SqlCE,而不是SQL Server。此外,SqlCE不支持存储过程。 - Skoder
对不起,我没有意识到您正在使用SqlCE。 - Vlad Bezden
没问题,我已经学习了UpdateBatchSize以备将来参考 ;) - Skoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接