Question: What is the best way to perform bulk inserts into an MS Access database from .NET? Using ADO.NET, it is taking way over an hour to write out a large dataset.

*Note that my original post, before I "refactored" it, had both the question and answer in the question part. I took Igor Turman's suggestion and re-wrote it in two parts - the question above and followed by my answer.*

Answer: 
**Thanks Marc**, in order to vote you I created an account on StackOverFlow...

Below is the reusable method [Tested on C# with 64 Bit - Win 7, Windows 2008 R2, Vista, XP platforms]

**Performance Details:**
Exports 120,000 Rows in 4 seconds.

Copy the below code and pass the parameters... and see the performance.

* Just pass your datatable with the same schema, as of target Access Db Table.
* DBPath= Full path of access Db
* TableNm = Name of Target Access Db table.

The code:

```
public void BulkExportToAccess(DataTable dtOutData, String DBPath, String TableNm) 
{
    DAO.DBEngine dbEngine = new DAO.DBEngine();
    Boolean CheckFl = false;

    try
    {
        DAO.Database db = dbEngine.OpenDatabase(DBPath);
        DAO.Recordset AccesssRecordset = db.OpenRecordset(TableNm);
        DAO.Field[] AccesssFields = new DAO.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();
    }
    finally
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(dbEngine);
        dbEngine = null;
    }
}

```
Another method to consider, involving linking tables via DAO or ADOX then executing statements like this:

```
SELECT * INTO Table1 FROM _LINKED_Table1

```

Please see my full answer here:  

[MS Access Batch Update via ADO.Net and COM Interoperability](https://stackoverflow.com/questions/15788441/ms-access-batch-update-via-ado-net-and-com-interoperability/26287252#26287252)