我在这里查看过很多问题/答案,我确定之前已经提出这个问题,但我无法找到它,因为它适用于我的确切情况。< / 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))
最后一行调用有问题的代码。
编辑: 解决方案最终是我的表名不在括号中。谢谢大家!