powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / OleDbTransaction, RollBack и RowState
5 сообщений из 5, страница 1 из 1
OleDbTransaction, RollBack и RowState
    #32401452
Oleg Solyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я и тормоз, но откат транзакции должен возвращать данные в исходное состояние.
В .Net вероятно считают, что это должно быть только на половину.
Если я не прав, то "поднимите мои веки" собственным опытом или ссылочкой.

OleDbDataAdapter.ContinueUpdateOnError=False (default) и очень хорошо
Имею DataSet. Внес изменения, сохраняю их в транзакции.
Но вот, не задача, произошел RollBack и в базу ничего не попало.
Но в DataSet ничего не откатилось. Ладно, Поле Autoincrement не возвратилось к своим значениям -1, -2...
Но в уже отработанных строках изменилось и RowState на Unchanged и как теперь понять, какие строки
были новыми, а какие и до изменений были Unchanged ?

Развитием сл.мыслей просьба не озадачивать себя:
- DataSet.RejectChanges - он скинет записи которые еще не были обновлены на момент ошибки, но не вернет
RowState в исходное состояние.
- DataSet.GetChanges(). Попробуйте потом сделать Merge на поле с автоинкрементом. Конечно, можно,
но написав свой DataSet. Видел я одних конструкторов, написавших на С# аналог DataSet + DataAdapter,
где один класс занимает 19 страниц текста А4. Для редактирования этого чуда они продают свой Wizard...

Господа, Ваши мысли ....

Живой пример для исследователей:

Sub MyUpdate(dad As OleDbDataAdapter, tds as Dataset)

Dim strConn as string="...."
Dim objConn as New OleDbConnection(strConn)
objConn.Open()
Dim objTranz As New OleDbTransaction=objConn.BeginTransaction()


AddHandler dad.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)

With dad
.cmdInsertCommand.Transaction=objTranz
.cmdDeleteCommand.Transaction=objTranz
.cmdUpdateCommand.Transaction=objTranz
End with

try
dad.Update(tds)
objTranz.Commit
catch exc As Exception
objTranz.RollBack
end try

Private Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)

Dim intID As Integer = 0

If args.Status <> UpdateStatus.Continue Then Return

If args.StatementType = StatementType.Insert Then
If args.Command.Connection.State <> ConnectionState.Closed Then
Dim cmd As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", args.Command.Connection, args.Command.Transaction)
intID = CType(cmd.ExecuteScalar, Int32)
End If
args.Row("ID") = intID
End If
End Sub
...
Рейтинг: 0 / 0
OleDbTransaction, RollBack и RowState
    #32401456
Oleg Solyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две мысли от г-на Seppa из Microsoft:

1. Делать DataSet.Copy и в случае RollBack работать с ним

2. В обработчике RowUpdated
установить RowUpdatedEventArgs.Status=UpdateStatus.SkipCurrentRow

и после транзакции делать DataSet.AcceptChanges

Может кто уже делал, что лучше ?

Поехал пробовать ...
...
Рейтинг: 0 / 0
OleDbTransaction, RollBack и RowState
    #32401489
Oleg Solyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приношу извинения за неправильное упоминание, в реалии - это
David Sceppa

2. Добавил в конец OnRowUpdated
args.Status=UpdateStatus.SkipCurrentRow

После objTranz.Commit добавил
tds.AcceptChanges

Что получаю:
Есть две записи:
1. A - новая, достоверно проходит Update
2 B - измененная, достоверно проходит Update
3. C - новая, достоверно заваливает Update на Exception
Порядок записей именно такой
Смотрим их RowState:
Before Update: Added - Modified- Added
After Update - catch: Modified - Modified - Added, if at OnRowUpdate replace identity
After Update - catch: Unmodified - Modified - Added, if at OnRowUpdate not replace identity
Все, пролет по полной
Не знаюб что имел в виду David Sceppa на news от microsoft, но что-то не получилось у меня, может ручками не вышел ...

1. Делаю перед Update
Dim tdsCopy as Dataset=tds.Copy
и далее
...
catch ...
objTranz.RollBack
tds=tdsCopy

Все работает на ура и наплевать на лишний DataSet, все не съэкономишь
...
Рейтинг: 0 / 0
OleDbTransaction, RollBack и RowState
    #32402034
Oleg Solyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чисто с Copy дело не прошло при связке DataSet c контролом теряется binding.
Не прошло и то как предлагает ms в msdn, спасибо, за ссылку от gotdotnet.ru, так как это чистый бред при наличии autoincrement.
Но проблему решил. Отвечу через мыло, так как хочется понять, как много людей у нас пишут реальные вещи, а не html-страницы в инете и не являются программистами от 1С, ведь задача-то насущная, но решений не видел нигдк в инете и книгах тоже
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
OleDbTransaction, RollBack и RowState
    #35586806
Tarakanov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Жаль, что тема заглохла. Очень нужно решение или хотя бы направление в нужную сторону. Проект как всегда горит, а судя по пустоте в яндексе - решения так и нет.
Если еще возможно, буду рад отклику. Мыло почему-то недоступно - может быть новый адрес дадите?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / OleDbTransaction, RollBack и RowState
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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