ODBCDataReader非常慢

时间:2019-02-05 16:55:45

标签: c# .net-core odbc

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

我已经看过许多关于此的博客和帖子,其中“慢”,“还有其他方式”等。这仅是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()上同样延迟了35秒

        OdbcDataAdapter adapter = new OdbcDataAdapter();
        DataSet ds = new DataSet();
        ds.Clear();

        adapter.SelectCommand = command;
        adapter.Fill(ds);

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

Access的最大字段数不能超过255,因此在210时您将接近该字段-虽然这可能是个问题,但是您可以确定是否有一个较小的字段数可以进行测试-但我对此怀疑。记录集查询运行速度很快。只需眨眼即可在Access中为该表运行选择查询--但是您正在建立一个在Access外部的连接,它出现在屏幕上-那么此代码位于..那是在调用ODBC阅读器吗?如果针对其他数据集格式(而不是Access mdb),相同的连接代码会更快吗? …。

答案 2 :(得分:0)

找到了这个,它纠正了我的问题!现在的结果令人惊讶... 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