|
Анализ граблей с OleDBTransaction и Identity
|
|||
---|---|---|---|
#18+
Наступил не давно на грабли (свои). Ни где в примерах о них не было ни слова (каюсь, в одном были слова, но не в коде). Все просто, но уже потом... Пишем обычную транзакцию с 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) Не наступайте на чужие грабельки... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2004, 01:03 |
|
Анализ граблей с OleDBTransaction и Identity
|
|||
---|---|---|---|
#18+
Есть две мысли от г-на Seppa из Microsoft: 1. Делать DataSet.Copy и в случае RollBack работать с ним 2. В обработчике RowUpdated установить RowUpdatedEventArgs.Status=UpdateStatus.SkipCurrentRow и после транзакции делать DataSet.AcceptChanges Может кто уже делал, что лучше ? Поехал пробовать ... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2004, 01:32 |
|
|
start [/forum/topic.php?fid=17&tid=1354229]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 132ms |
0 / 0 |