我在这里查看了很多问题/答案,我确信这之前已经被问过,但我找不到它,因为它适用于我的确切情况。
我有一个来自通用源(可以是任何东西)的 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))
最后一行调用了有问题的代码。
编辑:解决方案最终是我的表名不在括号中。谢谢大家!