| 
 | 
| 
 
Анализ граблей с 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&fpage=131&tid=1354229]:  | 
    0ms | 
get settings:  | 
    9ms | 
get forum list:  | 
    15ms | 
check forum access:  | 
    3ms | 
check topic access:  | 
    3ms | 
track hit:  | 
    56ms | 
get topic data:  | 
    13ms | 
get forum data:  | 
    3ms | 
get page messages:  | 
    35ms | 
get tp. blocked users:  | 
    1ms | 
| others: | 14ms | 
| total: | 152ms | 

| 0 / 0 | 

    Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
    
    
    «На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
    
    
    ... ля, ля, ля ...