1

我在这里查看了很多问题/答案,我确信这之前已经被问过,但我找不到它,因为它适用于我的确切情况。

我有一个来自通用源(可以是任何东西)的 system.data.datatable,我需要能够将其导出到 Access。原来的源其实可能是sql、excel等,但是已经成功存入了一个system.data.datable(没问题)。

在代码中,我创建了一个新的 Access DB .accdb 文件,通过遍历列和转换数据类型来创建表。这成功执行。

然后我们得到有问题的代码:

  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

这似乎工作正常,直到最后的 .Update(dt.copy) 调用,我得到一个插入语法错误。“CleanUpInsertCommand”只是将括号添加到列名(因为它们可能包含空格、关键字或用户可能输入的任何内容),并且似乎不是原因。在更新调用之前进行操作后,这是我当前测试中的 InsertCommand.CommandText:

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

据我所知,这看起来不错,因为我假设更新填充了值“?” 在 Update 调用期间使用适当的值。如果我错了,请纠正我(更新调用对我来说有点像黑匣子,我宁愿不突破反射器)。

我看不出是什么导致了这个问题,而且我收到了这个错误:异常:INSERT INTO 语句中的语法错误。类型:System.Data.OleDb.OleDbException

请帮忙。在有人回答之前,我会用头敲击键盘。

调用代码:

    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))

最后一行调用了有问题的代码。

编辑:解决方案最终是我的表名不在括号中。谢谢大家!

4

0 回答 0