#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. Когда вы добавляете новую запись в aDataTable
, она генерирует временный идентификатор. Если вы создаете запись клиента, вы затем будете использовать этот временный идентификатор в качестве FK в добавляемых вами записях заказов. При сохранении в базе данных генерируется окончательный идентификатор. Если конечный идентификатор для новой записи клиента отличается от FK в записях заказа, то эти записи заказа не могут быть вставлены. Что должно произойти, так это чтобы конечные идентификаторы были извлечены из базы данных в вашуDataSet
для распространения из таблицы Customer в таблицу Order.2. Продолжение. Этого не происходит по умолчанию с Access. Вам нужно немного поработать, чтобы это произошло. Смотрите здесь, чтобы узнать, как: vbforums.com /…
3. Спасибо @jmcilhinney , и спасибо за ссылку на пример. Я проверю это.