DataSet - как сохранить изменения.

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

DataSet - как сохранить изменения.

Сообщение dr.MIG » 22.07.2007 (Вс) 20:03

Собствено, сабж.

Код: Выделить всё
    Private myAccessConn As OleDbConnection
    Private dbReader As OleDbDataReader
    Private dbCmd As OleDbCommand
    Private dbAdapter As OleDbDataAdapter
    Private dsDataSet As DataSet = New DataSet("jDataSet")
    Private dtTable As DataTable
    Private dtName as String 'имя текущеей таблицы

'при щелчке на элементе TreeView открывается соответствующая таблица
Private Sub tvwActiveJ_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvwActiveJ.AfterSelect
            dsDataSet.Clear()
            dtName = String.Format("{0:000000}", CInt(e.Node.Name)
            dbCmd.CommandText = "SELECT * FROM " & dtName)
            dbAdapter = New OleDbDataAdapter
            dbAdapter.SelectCommand = dbCmd
            dbAdapter.Fill(dsDataSet, dtName)
            dtTable = dsDataSet.Tables.Item(dtName)
            'заполняем данными грид, в котором и будем редактировать данные
            grdJournal.SetDataBinding(dtTable, "")
            grdJournal.RetrieveStructure()
End Sub

Private Sub SaveChanges()
           dbAdapter.Update(dsDataSet, dtName)
End Sub


Грид при щелчке по TreeView заполняется нормально, но при выполнении процедуры SaveChanges() - происходит ошибка: "Update requires a valid UpdateCommand when passed DataRow collection with modified rows."
При этом она происходит, если изменить значение какого-либо поля, если не менять, то ничего не происходит.
Salus populi suprema lex

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 23.07.2007 (Пн) 0:54

dr.MIG
Приветствую.
Вы же сами себе отвечаете.
При этом она происходит, если изменить значение какого-либо поля

Для того что бы избежать ошибок, пишем так:
Код: Выделить всё

If dsDataSet.HasChanges(DataRowState.Modified) = True Then
     dbAdapter.Update(dsDataSet, dtName)
End If
dsDataSet.Tables(dtName).AcceptChanges()

Если в строках таблицы были изменения, то они будут внесены в БД и заодно приняты в ДС.
И вместо этого
Код: Выделить всё
dtTable = dsDataSet.Tables.Item(dtName)

вполне можно использовать
Код: Выделить всё
dtTable = dsDataSet.Tables(dtName)
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 23.07.2007 (Пн) 14:07

Спасибо за код. В общем - модифицировал SaveChanges() до
Код: Выделить всё
        If dsDataSet.HasChanges(DataRowState.Modified) = True Then
            dbAdapter.Update(dsDataSet, dtName)
        End If
        dsDataSet.Tables(dtName).AcceptChanges()


Пробую добавить запись:
Код: Выделить всё
dsDataSet.Tables(dtName).Rows.Add("11", "22", "33")

После выполнения кода - всё О'к - в гриде сразу пояляется новая строка.

Только тут, кажется, я чего-то не допонимаю в работе грида (у меня JanusGridEx). Он позволяет редактировать значения прямо в нём. Если попробовать что-нибудь изменить и вызвать SaveChanges() - ошибка о которой я писал выше. Неужели тогда перебивать ВСЕ значения из грида в DataSet.Tables путём Rows.Add (как-то не по .Netовски это...)? Мне казалось, что если грид связан (grdJournal.SetDataBinding(dtTable, "")), то всё должно происходить автоматически. В чём может быть проблема?
[/syntax]
Salus populi suprema lex

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 23.07.2007 (Пн) 23:52

dr.MIG
Можно и в данном случае нужно добавить условие в
Код: Выделить всё

If dsDataSet.HasChanges(DataRowState.Modified AND DataRowState.Added) = True Then
            dbAdapter.Update(dsDataSet, dtName)
            dsDataSet.Tables(dtName).AcceptChanges()
End If
       

Читаем библию программиста и изучаем методы и свойства используемого обьекта.
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 31.07.2007 (Вт) 10:23

Всё-таки всё работает.
Ошибка "Update requires a valid UpdateCommand when passed DataRow collection with modified rows" исправляется, как и гласит текст ошибки заданием UpdateCommand, что делается добавлением трёх строчек после строчки dbAdapter.SelectCommand = dbCmd
Код: Выделить всё
Dim dbCommandBuilder As New OleDbCommandBuilder(dbAdapter)
            dbAdapter.UpdateCommand = dbCommandBuilder.GetUpdateCommand()
            dbAdapter.InsertCommand = dbCommandBuilder.GetInsertCommand()


Плюс ко всему MSDN говорит о необходимости присутствия ключевых полей в таблице, кои у меня отсутствовали...
Salus populi suprema lex

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.07.2007 (Вт) 14:34

[quote="dr.MIG"]
dbAdapter.UpdateCommand = dbCommandBuilder.GetUpdateCommand()
dbAdapter.InsertCommand = dbCommandBuilder.GetInsertCommand()[/syntax]
quote]

Это лишнее)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 31.07.2007 (Вт) 14:45

Кстати да, оказывается достаточно создать экземпляр OleDbCommandBuilder... Забавно :roll:
Salus populi suprema lex

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 31.07.2007 (Вт) 17:12

dr.MIG писал(а):Кстати да, оказывается достаточно создать экземпляр OleDbCommandBuilder... Забавно :roll:


Он сам подписывается на события Дата адаптера)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 23.08.2007 (Чт) 13:32

Возник ещё вопрос. Добавляю столбец:
Код: Выделить всё
dsDataSet.Tables(dTName).Columns.Add("test")

Он добавляется в грид, но у меня не получается сохранить это изменение - в таблице из БД, с которой связан DataSet он не появляется...
Salus populi suprema lex

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 23.08.2007 (Чт) 14:48

dr.MIG

тёплое и мягкое

что в переводе означает - Ничего у Тебя не получится!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 23.08.2007 (Чт) 16:22

Хорошо, сформулируем иначе - как добавить столбец? Ну или хотя бы - как выполнить запрос 'ALTER TABLE...'?
Salus populi suprema lex

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 24.08.2007 (Пт) 8:33

cmd.commandtext = "ALTER TABLE t ADD new_col BIT"
cmd.ExecuteNonQuery


Вообщем, ничё нового
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList