将System.Data.Datatable复制到以编程方式访问数据库Vb.net

时间:2017-04-04 15:37:09

标签: vb.net ms-access oledbconnection oledbdataadapter system.data.datatable

我在这里查看过很多问题/答案,我确定之前已经提出这个问题,但我无法找到它,因为它适用于我的确切情况。< / p>

我有一个来自通用源的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)调用,我得到一个插入语法错误。 &#39; CleanUpInsertCommand&#39;只需在列名称中添加括号(因为它们可能包含空格,关键字或用户可能输入的任何内容),并且似乎不是原因。以下是在更新调用之前进行操作后当前测试中的InsertCommand.CommandText:

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

据我所知,这看起来不错,因为我认为更新填补了数值&#39;?&#39;在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))

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

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

0 个答案:

没有答案