在 C# 上使用 DAO 在 Access 中写入大量记录

Posted

技术标签:

【中文标题】在 C# 上使用 DAO 在 Access 中写入大量记录【英文标题】:Writing large number of record in Access with DAO on C# 【发布时间】:2016-11-02 15:58:05 【问题描述】:

我的问题如下:Writing large number of records (bulk insert) to Access in .NET/C#

我已经尝试了 DAO 指示的方法。起初,它不起作用,出现此错误:Retrieving the COM class factory for component with CLSID 681EF637-F129-4AE9-94BB-618937E3F6B6 failed due to the following error: 80040154.) 我已经搜索并找到了带有注册表项的解决方案,它有效,但是当我在另一台 PC 上尝试时,该功能使我的应用程序崩溃。

有我的代码,它失败的地方:

using Microsoft.Office.Interop.Access.Dao;

public void ExportDataTableToAccess(System.Data.DataTable dtOutData)

    Microsoft.Office.Interop.Access.Application access = new Microsoft.Office.Interop.Access.Application();

    _DBEngine dbEngine = null;

    try
    
        dbEngine = access.DBEngine; //Fails here

        //I have tried   DBEngine dbEngine = access.DBEngine
        //did not work either
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message);
    

    try
    
        Boolean CheckFl = false;
        string DBPath = dbPath;

        Database db = dbEngine.OpenDatabase(dbPath);
        Recordset AccesssRecordset = db.OpenRecordset(dtOutData.TableName);
        Field[] AccesssFields = new Field[dtOutData.Columns.Count];

        //Loop on each row of dtOutData
        for (Int32 rowCounter = 0; rowCounter < dtOutData.Rows.Count; rowCounter++)
        
            AccesssRecordset.AddNew();
            //Loop on column
            for (Int32 colCounter = 0; colCounter < dtOutData.Columns.Count; colCounter++)
            
                // for the first time... setup the field name.
                if (!CheckFl)
                    AccesssFields[colCounter] = AccesssRecordset.Fields[dtOutData.Columns[colCounter].ColumnName];
                AccesssFields[colCounter].Value = dtOutData.Rows[rowCounter][colCounter];
            

            AccesssRecordset.Update();
            CheckFl = true;
        

        AccesssRecordset.Close();
        db.Close();
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message);
    
    finally
    
       System.Runtime.InteropServices.Marshal.ReleaseComObject(dbEngine);
    

我也尝试过这个解决方案:How to repair COMException error 80040154?

它仍然可以在我的计算机上运行,​​但在其他计算机上无效。而且我不知道如何对每台计算机上的注册表进行所有操作以使其正常工作(我也不想要这个解决方案,因为它会花费大量时间)

我知道这是某个地方的 32-64 位问题,但是如果 x86 构建在其他计算机上不起作用...我应该如何解决这个问题?

这是我在这个网站上的第二个问题,如果我的问题有问题,请告诉我,我会尽一切可能纠正它:)

【问题讨论】:

很可能没有在其他计算机上安装所需的数据访问库。需要安装正确位版本(32 或 64)的 MDAC 库。另请注意,它们相当挑剔。 ps。如果一切可能尝试将您的数据库移动到 SQLExpress 或 SQLite 或不是 Access 的东西。它将减少部署、开发和调试的麻烦。 @dbugger 我的 Access 后端在 NAS 上(我知道,这不是最好的解决方案,但到目前为止效果很好)。我不熟悉 SQLExpress、SQLite 或 mysql,但对于我所读到的内容,我将无法进行更改(SQLite 无法在网络中工作,而对于另外两个我没有任何计算机可以运行数据库引擎并使其始终可供所有用户使用)因为它的用途不是很大(最多同时有 4 或 5 个用户),所以 Access 对我有好处。 Access 唯一限制我的是缺乏简单的快速批量插入实现,我在这里尝试做... 【参考方案1】:

安装 PIA 主互操作程序集以使用未找到的 DAO 驱动程序。

【讨论】:

以上是关于在 C# 上使用 DAO 在 Access 中写入大量记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 正确写入 Access (2002-2003) 数据库

C# 使用 DAO 或 ADOX 压缩和修复 .accdb 文件

C# 中的 ACEDAO 性能比 VB.net 慢得多

用Access作为后台数据库支撑,书写一个用C#写入记录的案例

如何使用C#将包含文字、图片和表格的二进制数据写入到word文件中

以Access为支撑,书写一个C#写入记录的案例