Скопируйте System.Data.Datatable для доступа к БД программным путем Vb.net
Я просмотрел очень много вопросов / ответов здесь, я уверен, что это уже задавалось раньше, но я не могу найти это, поскольку это относится к моей конкретной ситуации.
У меня есть 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 (?, ?, ?, ?, ?, ?, ?, ?)
Насколько я знаю, все выглядит хорошо, так как я предполагаю, что обновление заполняет значения '?' с соответствующим значением во время вызова обновления. Если я ошибаюсь, пожалуйста, поправьте меня (вызов обновления для меня является чем-то вроде черного ящика, я бы не стал использовать отражатель на нем).
Я не вижу, что является причиной проблемы, и я получаю эту ошибку: Исключение: синтаксическая ошибка в инструкции 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))
Последняя строка вызывает рассматриваемый код.
РЕДАКТИРОВАТЬ: Решение закончилось тем, что мое имя таблицы не было в скобках. Спасибо всем!