Не удается добавить записи в базу данных из двух таблиц одновременно

#database #vb.net #ms-access-2013

#База данных #vb.net #ms-access-2013

Вопрос:

Я написал vb.net программа, использующая Access.accdb. В базе данных есть три таблицы; Клиенты, Заказы и еще одна таблица, используемая только для заполнения выпадающего списка. У меня есть форма с текстовыми полями, привязанными к CustomersTableBindingSource, и элемент управления Navigator, а также у меня есть DataViewGrid, который показывает все заказы, связанные с этой конкретной записью Customers. Когда форма закрывается, она проверяет, есть ли изменения в наборе данных, и если да, то предлагается сохранить. Все это отлично работает, когда я вношу изменения либо в запись клиента в форме, либо в запись заказов в DataGridView, либо делаю оба одновременно. Я даже могу без проблем добавить новую запись Orders, и все будет нормально обновляться в базе данных. Проблема возникает, когда я пытаюсь создать новую запись Customers И одновременно добавлять заказы в эту запись. Пока я просто создаю запись клиентов и не добавляю никаких заказов, она отлично сохраняется, но если я добавляю к ней заказы, я получаю —

 You cannot add or change a record because a related record is required in table 'Customers'
  

Конечно, я могу сохранить только информацию о клиентах, а затем вернуться и добавить информацию о заказах позже, но это неудовлетворительно. Я хочу сделать оба одновременно.

Это может быть соответствующий код;

 Private Sub UpDatetheDataBase()
  Try
    Validate()
    CustomersBindingSource.EndEdit()
    OrdersBindingSource.EndEdit()
    TableAdapterManager.UpdateAll(CompanyDataSet)

    MsgBox("Update successful")

  Catch ex As Exception
    MsgBox("Error Number: " amp; Err.Number amp; vbCrLf amp; Err.Description amp; vbCrLf amp; "Update Failed!")
End Try
End Sub
  

И это.

 Private Sub OrdersBindingSource_AddingNew(sender As Object, e As AddingNewEventArgs) Handles OrdersBindingSource.AddingNew
    'Commit parent records in the dataset before adding new child records
    CustomersBindingSource.EndEdit()
End Sub
  

Родительская таблица: Клиенты
Дочерняя таблица: Заказы

 Customers Key Columns: ID
Orders Foreign Key Columns: CustomersID

Both Relation and Foreign Key Constraint
UpDate Rule: Cascade
Delete Rule: Cascade
Accept/Reject Rule: None
Checked Nested Relation
TableAdapterManager UpDateOrder UpDateInsertDelete
  

Если я изменю правило принятия / отклонения на каскадное, будет сохранена только запись клиентов, но информация о заказах сохранена не будет.
Я перепробовал все, что я знаю, и изучил любую информацию, которую смог найти, и я не могу решить эту проблему. Пожалуйста, я был бы искренне признателен за любую помощь.

Комментарии:

1. Предположительно, вы используете AutoNumber столбцы для PKS в Access. Когда вы добавляете новую запись в a DataTable , она генерирует временный идентификатор. Если вы создаете запись клиента, вы затем будете использовать этот временный идентификатор в качестве FK в добавляемых вами записях заказов. При сохранении в базе данных генерируется окончательный идентификатор. Если конечный идентификатор для новой записи клиента отличается от FK в записях заказа, то эти записи заказа не могут быть вставлены. Что должно произойти, так это чтобы конечные идентификаторы были извлечены из базы данных в вашу DataSet для распространения из таблицы Customer в таблицу Order.

2. Продолжение. Этого не происходит по умолчанию с Access. Вам нужно немного поработать, чтобы это произошло. Смотрите здесь, чтобы узнать, как: vbforums.com /…

3. Спасибо @jmcilhinney , и спасибо за ссылку на пример. Я проверю это.