Обновление базы данных Access из изменений DataGridView

Мне нужно обновить мою базу данных Access после того, как я внесу изменения в свой DataGridView под названием DataGridView_Manage_Calculations, а затем щелкну Button под названием Button_Update.

Вот код, который у меня есть до сих пор:

Dim dtManage As New DataTable
Dim ManageAdapter As OleDbDataAdapter
Dim Bsource As New BindingSource

Public Sub Show_Panel_Manage_Calculations()
    Panel_Manage_Calculations.Show()

    ManageAdapter = New OleDbDataAdapter("Select Calculation, [Interval], Formula From " & tblName & "", con)
    dtManage.Clear()
    ManageAdapter.Fill(dtManage)
    Bsource.DataSource = dtManage
    DataGridView_Manage_Calculations.DataSource = Bsource

End Sub

Private Sub Button_Update_Click(sender As Object, e As EventArgs) Handles Button_Update.Click
    Dim ObjComander As New OleDbCommandBuilder(ManageAdapter)
    ManageAdapter.Update(dtManage)
End Sub

Я получаю эту ошибку: Syntax error in INSERT INTO statement.

Что я делаю не так?

Дополнительная информация

Public Sub createTable_Criteria()
    Dim cmd As New OleDb.OleDbCommand("CREATE TABLE " & tblName & "(" & "Calculation Text(10) NOT NULL," & "[Interval] Text NOT NULL," & "Formula Text," & "Tier_Juncture_1 Integer," & "Tier_Juncture_2 Integer," & "Tier_Juncture_3 Integer," & "Weight Integer, CONSTRAINT pk_Calculation PRIMARY KEY (Calculation, [Interval]));", con)
    cmd.ExecuteNonQuery()
End Sub

person gromit1    schedule 11.10.2013    source источник
comment
Вы можете попробовать поставить точку останова на команду UPDATE и посмотреть свойство InsertCommand.CommandText внутри адаптера. Не могли бы вы показать этот текст?   -  person Steve    schedule 11.10.2013
comment
@ Стив, я не совсем уверен, что ты предлагаешь мне посмотреть.   -  person gromit1    schedule 11.10.2013
comment
homeandlearn.co.uk/NET/nets5p6.html   -  person Steve    schedule 11.10.2013
comment
@Steve, я разбираюсь в отладке и точках останова. Я просто не понимаю, что именно вы предлагаете мне посмотреть.   -  person gromit1    schedule 11.10.2013
comment
OleDbDataAdapter содержит свойство InsertCommand, которое подготавливается OleDbCommandBuilder с командой, используемой оператором Update. InsertCommand содержит свойство CommandText, и, согласно вашему сообщению об ошибке, этот текст неверен. Глядя на это, может быть важно понять, что вызывает ошибку.   -  person Steve    schedule 11.10.2013
comment
@Steve, я получил эту ошибку Additional information: Object reference not set to an instance of an object. в этой строке кода Debug.WriteLine(ManageAdapter.InsertCommand.CommandText)   -  person gromit1    schedule 11.10.2013


Ответы (1)


Глядя на вашу информацию в сообщении об ошибке, кажется, что ваш запрос SELECT не возвращает первичный ключ для таблицы в операторе выбора. В этом случае OleDbCommandBuilder не создает требуемую команду INSERT.

У вас есть два варианта:

  • Возвращает первичный ключ для выбранной таблицы
  • Создайте свои собственные команды INSERT/UPDATE/DELETE для адаптера.

Я не знаю структуру вашей таблицы (учитывая динамически построенный выбор), но лучший подход - вернуть первичный ключ в операторе выбора

person Steve    schedule 11.10.2013
comment
Это звучит неплохо. Как именно мне вернуть первичный ключ в операторе выбора? - person gromit1; 11.10.2013
comment
Проверьте свою таблицу в базе данных и добавьте это поле в оператор выбора. Например, если в вашей таблице есть поле автонумерации, вероятно, это также первичный ключ. (Маленький ключик в оформлении стола). Добавьте это поле в список выбора. - person Steve; 11.10.2013
comment
Я понимаю что ты имеешь ввиду. Мой первичный ключ состоит из полей Calculation и [Interval]. Они уже возвращены в моем операторе select. Я добавил код, который использую для создания таблицы, в свой исходный пост. - person gromit1; 12.10.2013
comment
Я попробую перенести инициализацию OleDbCommandBuilder сразу после создания OleDbAdapter внутрь метода Show_Panel_Manage_Calculations - person Steve; 12.10.2013
comment
Должно быть что-то, что не видно из вашего кода выше. Я хочу помочь, но у меня больше нет идей. Не поделитесь проектом? Если да, заархивируйте и разместите проект и базу данных на общем хосте, таком как gdrive, skydrive, dropbox, и разместите ссылку здесь. - person Steve; 12.10.2013