Есть DataSet в котором три тыблицы из БД (MS Access). Эти таблицы объединены по ключам с включенными Update, Delete, Accept/Reject в Cascade.
Есть форма на которой 3 DataGrid, каждый отображает одну из таблиц и позволяет редактирование и вставку записей.
Все синхронизируеться нормально, тоесть если в главной таблице выбираю запись в другом гриде показываються подчиненные записи.
Сохранение изменений производиться по кнопке код такой:
Try
adpClients.Update(dsClientsTechnics)
adpTechnics.Update(dsClientsTechnics)
adpHronology.Update(dsClientsTechnics)
dsClientsTechnics.AcceptChanges()
Catch DBErr As Exception
MessageBox.Show(DBErr.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
End Try
Так вот, если я в главной таблице добавляю запись, затем сразу добавляю запись в подчиненной таблице относящуюся к только что созданной в главной — то при сохранении запись в подчиненной таблице не сохраняеться. После перезапуска приложения ее нет.
Подскажите пожалуйста, как правильно реализовать сохранение подчиненных записй?
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re: VB.Net.DataSet: Вопрос по связанным таблицам и обновлени
bulkoed wrote:
... > Есть DataSet в котором три тыблицы из БД (MS Access). Эти таблицы > объединены по ключам с включенными Update, Delete, Accept/Reject > в Cascade. Есть форма на которой 3 DataGrid, каждый отображает > одну из таблиц и позволяет редактирование и вставку записей. Все > синхронизируеться нормально, тоесть если в главной таблице выбираю > запись в другом гриде показываються подчиненные записи. Сохранение > изменений производиться по кнопке код такой:
... > Так вот, если я в главной таблице добавляю запись, затем сразу > добавляю запись в подчиненной таблице относящуюся к только что > созданной в главной — то при сохранении запись в подчиненной таблице > не сохраняеться. После перезапуска приложения ее нет. Подскажите > пожалуйста, как правильно реализовать сохранение подчиненных записй?
Денис,
это так просто не работает, т.к. надо сначало обработать все новые записи от отца до внука, потом записи с изменеиями от отца до внука и в последную очередь удаленные записи от внука до отца.
Напр.:
Tab1 -> Tab2 -> Tab3
Dim cb1 As New OleDbCommandBuilder(dadp1)
Dim cb2 As New OleDbCommandBuilder(dadp2)
Dim cb3 As New OleDbCommandBuilder(dadp3)
Me.BindingContext(dset, "Tab1").EndCurrentEdit()
Me.BindingContext(dset, "Tab2").EndCurrentEdit()
Me.BindingContext(dset, "Tab3").EndCurrentEdit()
Dim myDataRowArray() As DataRow
Try' New Row's
myDataRowArray = dset.Tables("Tab1").Select(Nothing, Nothing, DataViewRowState.Added)
dadp1.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab2").Select(Nothing, Nothing, DataViewRowState.Added)
dadp2.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab3").Select(Nothing, Nothing, DataViewRowState.Added)
dadp3.Update(myDataRowArray)
' Updated Row's
myDataRowArray = dset.Tables("Tab1").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
dadp1.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab2").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
dadp2.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab3").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
dadp3.Update(myDataRowArray)
' Deleted Row's
myDataRowArray = dset.Tables("Tab3").Select(Nothing, Nothing, DataViewRowState.Deleted)
dadp3.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab2").Select(Nothing, Nothing, DataViewRowState.Deleted)
dadp2.Update(myDataRowArray)
myDataRowArray = dset.Tables("Tab1").Select(Nothing, Nothing, DataViewRowState.Deleted)
dadp1.Update(myDataRowArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Peter
Posted via RSDN NNTP Server 1.8
Re[2]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
Приветствую Вас.
> Денис, > это так просто не работает, т.к. надо сначало обработать все новые записи от отца до внука, потом записи с изменеиями от отца до внука и в последную очередь удаленные записи от внука до отца. > > Напр.: >
А куда же мне вставлять этот код если я работаю только через DataGrid'ы и визуально создавал OleDBDataAdapter'ы?
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[3]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
bulkoed wrote: > Приветствую Вас. > >> Денис, >> это так просто не работает, т.к. надо сначало обработать все новые >> записи от отца до внука, потом записи с изменеиями от отца до внука >> и в последную очередь удаленные записи от внука до отца. >> >> Напр.: >> > > А куда же мне вставлять этот код если я работаю только через > DataGrid'ы и визуально создавал OleDBDataAdapter'ы?
Денис,
ставь в тот код, который ты визуально создал, а именно в то место, где обрабатывается событие по сохранению всех данных.
Peter
Posted via RSDN NNTP Server 1.8
Re[4]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752287@news.rsdn.ru... > bulkoed wrote: > > Приветствую Вас. > > > >> Денис, > >> это так просто не работает, т.к. надо сначало обработать все новые > >> записи от отца до внука, потом записи с изменеиями от отца до внука > >> и в последную очередь удаленные записи от внука до отца. > >> > >> Напр.: > >> > > > > А куда же мне вставлять этот код если я работаю только через > > DataGrid'ы и визуально создавал OleDBDataAdapter'ы? > > Денис, > ставь в тот код, который ты визуально создал, а именно в то место, где обрабатывается событие по сохранению всех данных.
Ага, а уже после этого нужно делать созранение? Я верно понял? И еще там были строки:
Dim cb1 As New OleDbCommandBuilder(dadp1)
Dim cb2 As New OleDbCommandBuilder(dadp2)
Dim cb3 As New OleDbCommandBuilder(dadp3)
Они к чему?
И еще myDataRowArray как относиться к моей БД? Или нужно после всего что-то именно с ней делать? Если так то что? Приведите примерчик пожалуйста.
Заранее премного благодарен!
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[5]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
bulkoed wrote:
... > Ага, а уже после этого нужно делать созранение? Я верно понял? И > еще там были строки: > >
> Dim cb1 As New OleDbCommandBuilder(dadp1)
> Dim cb2 As New OleDbCommandBuilder(dadp2)
> Dim cb3 As New OleDbCommandBuilder(dadp3)
>
> > Они к чему?
Ими можно пользоваться для создания CommandText для Command Objects для адаптера (InsertCommand, DeleteCommand и UpdateCommand).
> И еще myDataRowArray как относиться к моей БД?
Никак, просто в них содбпраютя все записи для Update.
> Или нужно после > всего что-то именно с ней делать? Если так то что? Приведите > примерчик пожалуйста. ...
Я же привел пример. Этот код ставишь в код события для храниения данных, напр. буттон "Запсиь".
Peter
Posted via RSDN NNTP Server 1.8
Re[6]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752425@news.rsdn.ru... > bulkoed wrote: > ...
> > Или нужно после > > всего что-то именно с ней делать? Если так то что? Приведите > > примерчик пожалуйста. ... > > Я же привел пример. Этот код ставишь в код события для храниения данных, напр. буттон "Запсиь".
Ага, тоесть я так понял мой код будет примерно таким:
Dim myDataRowArray() As DataRow
Try' Новые записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.Added)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.Added)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.Added)
adpHronology.Update(myDataRowArray)
' Обновленные записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpHronology.Update(myDataRowArray)
' Удаленные записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpHronology.Update(myDataRowArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Try
adpClients.Update(dsClientsTechnics)
adpTechnics.Update(dsClientsTechnics)
adpHronology.Update(dsClientsTechnics)
dsClientsTechnics.AcceptChanges()
Catch DBErr As Exception
MessageBox.Show(DBErr.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1)
End Try
Верно?
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[7]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
Приветствую Вас.
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752697@news.rsdn.ru... > bulkoed wrote: > ... > > Верно? > > Нет, причатай еще раз ответы.
Ну в общем все равно не работает. Тоесть работает но и так как раньше. При сохранении говорит что нужно наличие свзязанной записи в главной таблице.
Но ведь связь то есть, даже видно при добавлении подчиненной, что ее ключевое поле для связи приобретает номер ключа главной записи.
Черт, совсем запутался. Блин.
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[9]: VB.Net.DataSet: Вопрос по связанным таблицам и обновл
внук.Update -потом- сын.Update -потом- мастер.Update
> Тоесть работает но и так как > раньше. При сохранении говорит что нужно наличие свзязанной > записи в главной таблице.
Эта ошибка может возникнуть, если добовляешь запись-сына и еще не добавлен запись мастера, т.е не выполнен вышеизложенную последовательность.
Peter
Posted via RSDN NNTP Server 1.8
Re[10]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752839@news.rsdn.ru... > bulkoed wrote: > ... > > Ну в общем все равно не работает. > > Денис, > начнем еще раз: >
... > Эта ошибка может возникнуть, если добовляешь запись-сына и еще не добавлен запись мастера, т.е не выполнен вышеизложенную последовательность.
Я делаю так. Добавляю запись в мастер, делаю сохранение, добавляю запись в сын, когда делаю сохранение — выдаеться мне то чо писал выше.
Вот код моей процедуры сохранения:
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
Dim myDataRowArray() As DataRow
Try' Новые записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.Added)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.Added)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.Added)
adpHronology.Update(myDataRowArray)
' Обновленные записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent)
adpHronology.Update(myDataRowArray)
' Удаленные записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.Deleted)
adpHronology.Update(myDataRowArray)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[11]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
bulkoed wrote:
... > ... >> Эта ошибка может возникнуть, если добовляешь запись-сына и еще не >> добавлен запись мастера, т.е не выполнен вышеизложенную >> последовательность. > > Я делаю так. Добавляю запись в мастер, делаю сохранение, добавляю > запись в сын, когда делаю сохранение — выдаеться мне то чо писал > выше. Вот код моей процедуры сохранения:
А ты проверил, что на самом деле действительно так выполняется?
Какая таблица у тебя мастер, какая сын, какая внук?
Peter
Posted via RSDN NNTP Server 1.8
Re[12]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752904@news.rsdn.ru... > bulkoed wrote: > ... > > ... > >> Эта ошибка может возникнуть, если добовляешь запись-сына и еще не > >> добавлен запись мастера, т.е не выполнен вышеизложенную > >> последовательность. > > > > Я делаю так. Добавляю запись в мастер, делаю сохранение, добавляю > > запись в сын, когда делаю сохранение — выдаеться мне то чо писал > > выше. Вот код моей процедуры сохранения: > > А ты проверил, что на самом деле действительно так выполняется? > > Какая таблица у тебя мастер, какая сын, какая внук?
Мастер — Clients, ее сын Technics, сын Technics — Hronology.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[13]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752939@news.rsdn.ru... > bulkoed wrote: > ... > >> Какая таблица у тебя мастер, какая сын, какая внук? > > > > Мастер — Clients, ее сын Technics, сын Technics — Hronology. >
> Как ты генерируешь ключи?
Да вообщето я их не генерирую. Там поле AutoIncrement. Оно автоматом вырабатыветься.
> На какой строке какая ошибка выскакивает?
Ошибка вылетает не в VB среде, а ошибка провайдера данных OLE DB, просто пишет по русски то что я писал выше.
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[15]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
bulkoed wrote:
... >> Как ты генерируешь ключи? > Да вообщето я их не генерирую. Там поле AutoIncrement. Оно > автоматом вырабатыветься.
Денис,
тогда может возникнуть следующая проблема. При создания новой мастер-записи в клиенте генерируется ключ. После Update в БД генерируется свой ключ, который может не совпадать с ключом в клиенте. При создания записи-сына значение мастер-ключа, который находится в клиенте, записывается для связи в запись сына. Когда выполняется Update сына может вылетать ошибка, потому-что не найдена соответствующая мастер-запись в следствии несовпадения ключей. При работе нескольких клиентов одновременно ситуацая может быть еще хуже.
Выход здесь один, который хорошо работает и в многоклиентской сфере.
1. В клиенте назначаются отрицательные ключи с отрицательным шагом.
2. После Update каждой записи сразу считывается назначенное сервером значение ключа и записывается в соответствующую запись.
>> На какой строке какая ошибка выскакивает? > > Ошибка вылетает не в VB среде, а ошибка провайдера данных OLE DB, > просто пишет по русски то что я писал выше.
Убири временно tyr/catch или выполняай в шаговом режима или запомни номер строки при ошибке (ErrorStack).
Peter
Posted via RSDN NNTP Server 1.8
Re[16]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:752988@news.rsdn.ru... > bulkoed wrote: > ...
> Убири временно tyr/catch или выполняай в шаговом режима или запомни номер строки при ошибке (ErrorStack).
Только что убрал try/catch блоки и вот что получилось:
1. Создаю запись в таблице Clients (мастер). Произвожу сейв.
2. Создаю запись в таблице Technics, подчиненную созданной записи из таблицы Clients. Произвожу сейв.
3. Создаю запись в таблице Hronology, подчиненную созданной записи из таблицы Technics. Произвожу сейв и получаю ошибку вот здесь:
' Новые записи
myDataRowArray = dsClientsTechnics.Tables("Clients").Select(Nothing, Nothing, DataViewRowState.Added)
adpClients.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Technics").Select(Nothing, Nothing, DataViewRowState.Added)
adpTechnics.Update(myDataRowArray)
myDataRowArray = dsClientsTechnics.Tables("Hronology").Select(Nothing, Nothing, DataViewRowState.Added)
adpHronology.Update(myDataRowArray) REM Вот тут остановилось с ошибкой в System.Data.OleDb вроде
После рестарта: запись таблицы Clients и подчиненная ей запись таблицы Technics на своем месте, записи в Hronology естевственно нет
Чего посоветуете?
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[17]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
bulkoed wrote:
... > adpHronology.Update(myDataRowArray) REM Вот тут остановилось с > ошибкой в System.Data.OleDb вроде > > [/vb] > > После рестарта: запись таблицы Clients и подчиненная ей запись > таблицы Technics на своем месте, записи в Hronology естевственно нет > Чего посоветуете?
Денис,
а вот сейсач нужно еще раз точное описание ошибки. Для этого лучше всего использовать try/catch, порставить braekpoint и выводить ex.Message.
Мне кажется, что либо ключевое значение на записывается в запись "Hronology", либо в БД стоит неверное отношение.
Peter
Posted via RSDN NNTP Server 1.8
Re[18]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
"Peter Fleischer" <28181@news.rsdn.ru> сообщил/сообщила в новостях следующее: news:753017@news.rsdn.ru... > bulkoed wrote: > ... > > adpHronology.Update(myDataRowArray) REM Вот тут остановилось с > > ошибкой в System.Data.OleDb вроде > > > > [/vb] > > > > После рестарта: запись таблицы Clients и подчиненная ей запись > > таблицы Technics на своем месте, записи в Hronology естевственно нет > > Чего посоветуете? > > Денис, > а вот сейсач нужно еще раз точное описание ошибки. Для этого лучше всего использовать try/catch, порставить braekpoint и выводить ex.Message. > > Мне кажется, что либо ключевое значение на записывается в запись "Hronology", либо в БД стоит неверное отношение. > > Peter
Только что проверил все, вклоючил в DataGrid отображение ключевых полей. Так вот Hronology при вставке получает нужное значение ключевого поля таблицы Technics, в схеме DataSet все реляции верны, такая же реляция как и между Clients/Technics и всеравно мне выдаеться:
"Для обеспечения целостности данных необходимо наличие связанной записи в таблице Technics". Вот блин, никак не могу понять почему. Ведь ничто не отличаеться от связки первых двух таблиц.
С уважением,
Денис.
Posted via RSDN NNTP Server 1.9 beta
С уважением,
Денис.
Re[19]: VB.Net.DataSet: Вопрос по связанным таблицам и обнов
bulkoed wrote:
... > Только что проверил все, вклоючил в DataGrid отображение ключевых > полей. Так вот Hronology при вставке получает нужное значение > ключевого поля таблицы Technics, в схеме DataSet все реляции верны, > такая же реляция как и между Clients/Technics и всеравно мне > выдаеться: > > "Для обеспечения целостности данных необходимо наличие связанной > записи в таблице Technics". Вот блин, никак не могу понять почему. > Ведь ничто не отличаеться от связки первых двух таблиц.
Денис,
эту ошибку выдает БД! Т.е., если в банке неверная связь (foreign contraint), то провайдер выдает ошибку, даже если в клиенте все верно. Это проверил?