powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SqlDataAdapter.Update в транзакции
6 сообщений из 6, страница 1 из 1
SqlDataAdapter.Update в транзакции
    #38958148
KOPOJlb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Не знаю, как побороть следующую проблему:

Хочу чтобы изменения в dataset либо полность сохранялись в базу (если нет ошибок: триггеры, ограничения уникальности, которые прописаны в БД), либо полностью не сохранялись (чтобы пользователь имел возможность все исправить и сохранить заново). Думаю, что это решается с помощью транзакции. Вот написал такой код. Но есть одна проблема: после первой попытки сохранения (если есть ошибки) dset считает, что уже выполнил все изменения для корректных записей (хотя я их откатил) и при повторной апдейте сохраняется только та запись, которая была ошибочной при первом проходе. Как заставить dset откатиться до состояния перед апдейтом?

Код сократил, только чтобы видеть суть.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
        'Вывод данные
        adapter.Fill(dset, "tBudget")
        Me.dGridViewMain.DataSource = dset.Tables("tBudget")

        'Тут можно сделать какие-нибудь изменения

        dSetChanges = dset.GetChanges()
        dTable = Me.dGridViewMain.DataSource

        If dSetChanges Is Nothing Then
            MsgBox("Изменений не было", vbInformation)
        Else

            cmdb = New SqlCommandBuilder(adapter)


            adapter.DeleteCommand = cmdb.GetDeleteCommand
            adapter.InsertCommand = cmdb.GetInsertCommand
            adapter.UpdateCommand = cmdb.GetUpdateCommand

            Tran = cnn.BeginTransaction()

            adapter.DeleteCommand.Transaction = Tran
            adapter.InsertCommand.Transaction = Tran
            adapter.UpdateCommand.Transaction = Tran

            adapter.ContinueUpdateOnError = True
            adapter.Update(dset, "tBudget")

            If dset.HasErrors Then
                Tran.Rollback()
                MsgBox("Данные не сохранены" & vbCrLf & "Найдены ошибки", vbCritical)
            Else
                Tran.Commit()
                MsgBox("Успешно", vbInformation)
            End If



Надеюсь на вашу помощь. Заранее спасибо.
...
Рейтинг: 0 / 0
SqlDataAdapter.Update в транзакции
    #38958376
KOPOJlb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла идея: при нажатии на save, создавать копию Dataset и апдейтить ее. Наверное, можно выкрутиться, может есть человеческий метод?)
...
Рейтинг: 0 / 0
SqlDataAdapter.Update в транзакции
    #38958828
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOPOJlb,

книга "Программирование на ADO.NET 2.0", Дэвид Сеппа, главы 10, 11.
...
Рейтинг: 0 / 0
SqlDataAdapter.Update в транзакции
    #38959476
KOPOJlb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, конечно, почитал, узнал много нового, но ответа на вопрос не нашел (может плохо понял?).
Похоже нужно делать копию датасета.
Т.к. после выполнения апдейта в транзакции строки в дататейбл приобретают RowState = Unchanged. И им глубоко пофиг, что транзакция откатилась.
Видимо стандартного методы для этого нет, нужно городить что-то свое.
...
Рейтинг: 0 / 0
SqlDataAdapter.Update в транзакции
    #38960306
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KOPOJlb,

действительно, объект DataSet не знает о транзакции. Он не следит за отложенными изменениями, которые передаются в транзакцию. Откат транзакции не вернёт DataSet в состояние, предшествующее транзакции.

В упомянутой книге в разделе "Объекты DataSet и транзакции" (стр. 527) вкратце описано, как поступать в таких случаях. Да, нужно создавать копию датасета. И при неудачной транзакции использовать эту копию.

К книге идут примеры кода. В одном из них показан данный сценарий.
...
Рейтинг: 0 / 0
SqlDataAdapter.Update в транзакции
    #38961046
KOPOJlb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, тему можно считать закрытой.
Сделал с копией датасета.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SqlDataAdapter.Update в транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]