|
|
|
OleDbTransaction, RollBack и RowState
|
|||
|---|---|---|---|
|
#18+
Может я и тормоз, но откат транзакции должен возвращать данные в исходное состояние. В .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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 01:05 |
|
||
|
OleDbTransaction, RollBack и RowState
|
|||
|---|---|---|---|
|
#18+
Есть две мысли от г-на Seppa из Microsoft: 1. Делать DataSet.Copy и в случае RollBack работать с ним 2. В обработчике RowUpdated установить RowUpdatedEventArgs.Status=UpdateStatus.SkipCurrentRow и после транзакции делать DataSet.AcceptChanges Может кто уже делал, что лучше ? Поехал пробовать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 01:50 |
|
||
|
OleDbTransaction, RollBack и RowState
|
|||
|---|---|---|---|
|
#18+
Приношу извинения за неправильное упоминание, в реалии - это 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, все не съэкономишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 05:34 |
|
||
|
OleDbTransaction, RollBack и RowState
|
|||
|---|---|---|---|
|
#18+
Чисто с Copy дело не прошло при связке DataSet c контролом теряется binding. Не прошло и то как предлагает ms в msdn, спасибо, за ссылку от gotdotnet.ru, так как это чистый бред при наличии autoincrement. Но проблему решил. Отвечу через мыло, так как хочется понять, как много людей у нас пишут реальные вещи, а не html-страницы в инете и не являются программистами от 1С, ведь задача-то насущная, но решений не видел нигдк в инете и книгах тоже ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2004, 01:54 |
|
||
|
OleDbTransaction, RollBack и RowState
|
|||
|---|---|---|---|
|
#18+
Жаль, что тема заглохла. Очень нужно решение или хотя бы направление в нужную сторону. Проект как всегда горит, а судя по пустоте в яндексе - решения так и нет. Если еще возможно, буду рад отклику. Мыло почему-то недоступно - может быть новый адрес дадите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2008, 22:12 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=17&tid=1352117]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 365ms |

| 0 / 0 |
