Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Анализ граблей с OleDBTransaction и Identity / 3 сообщений из 3, страница 1 из 1
07.02.2004, 01:03
    #32401450
Oleg Solyanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ граблей с OleDBTransaction и Identity
Наступил не давно на грабли (свои). Ни где в примерах о них не было ни слова (каюсь, в одном были слова, но не в коде). Все просто, но уже потом...
Пишем обычную транзакцию с Access. Пример очень облегчен, так что не пинайте, особенно по голове, я ее зарабатываю...

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

End Sub

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)
intID = CType(cmd.ExecuteScalar, Int32)
End If
args.Row("ID") = intID
End If
End Sub

И получаем ошибку исполнения с exc.message:
"Execute requires the command to have a transaction object when the connection assigned to the Command is in a pending local transaction/ The transaction property of the Command has not been initialized"

Ни где нет описания на такую ошибку и большинство полагает, что она возникает, когда командам DataAdapter не назначили текущий объект OleDbTransaction.
With dad
.cmdInsertCommand.Transaction=objTranz
...
end with

Но собака порылась дальше. Она в обработчике события OnRowUpdated.
Выполняемая команда должна быть то же в транзакции и правильный ее вид:

Dim cmd As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", args.Command.Connection, args.Command.Transaction)

Не наступайте на чужие грабельки...
...
Рейтинг: 0 / 0
07.02.2004, 01:32
    #32401454
Oleg Solyanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ граблей с OleDBTransaction и Identity
Есть две мысли от г-на Seppa из Microsoft:

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

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

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

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

Поехал пробовать ...
...
Рейтинг: 0 / 0
07.02.2004, 01:51
    #32401457
Oleg Solyanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Анализ граблей с OleDBTransaction и Identity
Тьфу-ты, перепутал темы для ответа
Большое sorry
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Анализ граблей с OleDBTransaction и Identity / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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