Copy System.Data.Datatable to Access DB Programmatically Vb.net

113 views Asked by At

I've looked through an awful lot of questions/answers here, I'm sure this has to have been asked before but I can't find it as it applies to my exact situation.

I have a system.data.datatable from a generic source (could be anything), and I need to be able to export it to Access. The original source may in fact be sql, excel, etc., but it's been stored in a system.data.datable successfully (no problem).

In code, I create a new Access DB .accdb file, create the table by looping through the columns and translating the data types. This executes successfully.

Then we get to the code that is problematic:

  Try

        dt.TableName = tableName
        Using accConnection As New OleDb.OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=False;", dbPath))

            'first create table
            CreateTable(accConnection, dt, tableName)

            'set up dataadapter to copy data over
            Dim selectCommand As String = String.Format("SELECT * From {0}", tableName)
            Dim accDataAdapter As New OleDb.OleDbDataAdapter(selectCommand, accConnection)
            'accDataAdapter.TableMappings.Add(tableName, tableName)

            Dim accCommandBuilder As New OleDb.OleDbCommandBuilder(accDataAdapter)
            accDataAdapter.InsertCommand = accCommandBuilder.GetInsertCommand
            'accDataAdapter.UpdateCommand = accCommandBuilder.GetUpdateCommand
            CleanUpInsertCommand(accDataAdapter.InsertCommand)
            'CleanUpUpdateCommand(accDataAdapter.UpdateCommand)

            accDataAdapter.Update(dt.Copy)

        End Using

    Catch ex As Exception
        Utility.HandleExceptionWithDefaults(ex, String.Format("Copying {0} to {1}", tableName, dbPath))
        Return False
    End Try

This seems to work fine up until the final .Update(dt.copy) call, where I get an insert syntax error. The 'CleanUpInsertCommand' simply adds brackets to the column names (since they may include spaces, keywords, or whatever a user may have entered), and does not appear to be the cause. Here is the InsertCommand.CommandText in my current test after manipulation prior to the update call:

INSERT INTO Addendum_A_Preview ([variablename1] , [variablename2], [variablename3], [variablename4], [variablename5], [variablename6], [variablename7], [variablename8]) VALUES (?, ?, ?, ?, ?, ?, ?, ?)

Which looks fine, as far as I know, since I assume the update fills the values '?' with the appropriate value during the Update call. If I'm wrong, please correct me (the update call is a bit of a blackbox to me, I'd rather not breakout reflector on it).

I can't see what's causing the issue though, and I'm getting this error: Exception: Syntax error in INSERT INTO statement. Type: System.Data.OleDb.OleDbException

Please help. I'll be beating my head against the keyboard until someone answers.

Calling Code:

    Dim dt As DataTable = DirectCast(gridData.DataSource, DataTable)
    Dim dbPath As String = String.Format("{0}\{1}.accdb", FileIO.SpecialDirectories.Desktop, _outputFileName) 'FileIO.SpecialDirectories.Desktop, _outputFileName)

    AccessHelper.CreateNewDatabase(dbPath)
    AccessHelper.AddTableToDatabase(dbPath, dt, _outputFileName.Replace(" "c, "_"c))

Last line calls the code in question.

EDIT: Solution ended up being my table name was not in brackets. Thanks all!

0

There are 0 answers