代码之家  ›  专栏  ›  技术社区  ›  kenyu73

ODBCDataReader非常慢

  •  0
  • kenyu73  · 技术社区  · 7 年前

    下面的基本代码大约需要35秒才能完成 dt.load(reader) . 该数据库是一个MS Access.mdb数据库,大约有210列,可能有37行。

    我看过很多关于这方面的博客和帖子,其中有“Itslow”,“Whees there way”等等。这只有200行左右。。。最多1秒钟吧?

    string connectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)}; Dbq=" + file;
    _conn = new OdbcConnection(connectionString);
    
    string sql = "select * from fields";
    
    OdbcCommand command = new OdbcCommand(sql, _conn);
    OdbcDataReader reader = command.ExecuteReader();
    DataTable dt = new DataTable();
    
    dt.Load(reader); // 30+ seconds to complete
    
    foreach (DataRow row in dt.Rows)
    {
        ...
    

    Fill()

            OdbcDataAdapter adapter = new OdbcDataAdapter();
            DataSet ds = new DataSet();
            ds.Clear();
    
            adapter.SelectCommand = command;
            adapter.Fill(ds);
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Auction God    7 年前

    当多个用户访问数据库时,访问速度要慢得多。确保您的应用未连接,并检查access目录中的.ldb文件。如果它在那里,其他人打开了它(或者撞坏了,留下锁)。 如果是,请尝试菜单中的“压缩并修复”选项。(默认情况下,它在最后一个人退出数据库时运行,但如果有人崩溃,数据库将永远不会被压缩)。

        2
  •  1
  •   Cahaba Data    7 年前

    Access是一个前端数据库,这意味着表本质上是被动的——在某种意义上与csv文件没有什么不同。

    Access的最大字段数为255,所以在210处,您正在接近这个值——虽然这可能是一个问题,但您可以测试一个较低的字段数,以确保这一点——但我怀疑这一点。记录集查询运行速度很快。在Access中为此表运行select查询将在一眨眼之间执行--但是您正在Access之外设置连接--看起来是这样的--那么此代码位于何处。。是调用ODBC读取器吗?如果针对不同于Access mdb的数据集格式,相同的连接代码会更快吗?….

        3
  •  1
  •   kenyu73    7 年前

    找到这个,它纠正了我的问题!现在有惊人的结果。。。327毫秒,包括同一调用(目标连接)中EF.core方法调用的开销。

    https://answers.microsoft.com/en-us/office/forum/office_2010-access/my-solution-to-access-being-slow-with-odbc/a5a6522f-a70f-421e-af1b-48327075e010

    enter image description here