過去ログ

                                Page     484
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼データのRollbackについて  豆っち 04/1/15(木) 11:31
   ┗Re:データのRollbackについて  イケガミ 04/1/15(木) 11:53
      ┗Re:データのRollbackについて  豆っち 04/1/15(木) 13:18
         ┣Re:データのRollbackについて  豆っち 04/1/15(木) 13:27
         ┗Re:データのRollbackについて  イケガミ 04/1/15(木) 13:40
            ┗Re:データのRollbackについて  豆っち 04/1/15(木) 13:52
               ┗Re:データのRollbackについて  豆っち 04/1/15(木) 16:26

 ───────────────────────────────────────
 ■題名 : データのRollbackについて
 ■名前 : 豆っち
 ■日付 : 04/1/15(木) 11:31
 -------------------------------------------------------------------------
   Access2000を使ってRollback、Commitの処理を入れるにはどうやればいいのでしょうか?
とりあえずあちこちのHPを調べて下記のようなコードを作ってみたのですが、
うまくRollbackしてくれませんでした。
すごく単純な事だとは思うのですが、よろしくお願いします。m(_ _)m

Private Sub コマンド1_Click()
  Dim flg As Long

  flg = 1

  ' トランザクションSTART
  DBEngine.Workspaces(0).BeginTrans
  ' Insert文発行
  Call DoCmd.RunSQL("INSERT INTO テーブル1(AAA) VALUES ('TEST')")
  
  If flg = 1 Then
    ' ロールバック
    DBEngine.Workspaces(0).Rollback
  Else
    ' コミット
    DBEngine.Workspaces(0).CommitTrans
  End If
End Sub

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : イケガミ  ■日付 : 04/1/15(木) 11:53  -------------------------------------------------------------------------
   >  Call DoCmd.RunSQL("INSERT INTO テーブル1(AAA) VALUES ('TEST')")
DoCmd.RunSQL で実行したものは、トランザクションは使えないと思います。


DAO から ADO への移植
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado_8.asp

こちらに、DAO,ADO双方の記述例があります。

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : 豆っち  ■日付 : 04/1/15(木) 13:18  -------------------------------------------------------------------------
   ▼イケガミ さん:

素早い返信、どうもありがとうございます!

>DoCmd.RunSQL で実行したものは、トランザクションは使えないと思います。
なるほど、、、RunSQLを使ってしまうとCommit, Rollbackが
できなくなってしまうのですね。
今度はコードをDAOの記述例を参照して作成してみました。
ですが今度はSQLのInsert文がうまく流れないようです。
以下、ソースです。

Private Sub コマンド1_Click()
  Dim wks As DAO.Workspace
  Dim db As DAO.Database
  Dim flg As Long

  ' 初期処理
  flg = 1

  Set wks = DBEngine.Workspaces(0)
  Set db = wks.OpenDatabase("C:\test.mdb")
  ' Set db = CurrentDb() と、記述可能?

  ' トランザクションSTART
  wks.BeginTrans
  ' Insert文発行
  db.Execute "INSERT INTO テーブル1(AAA) VALUES ('TEST');"
  
  If flg = 1 Then
    ' ロールバック
    wks.Rollback
  Else
    ' コミット
    wks.CommitTrans
  End If
End Sub

どうかご指摘の方、よろしくお願いします。m(_ _)m

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : 豆っち  ■日付 : 04/1/15(木) 13:27  -------------------------------------------------------------------------
   すみません、書き忘れです。
DAOを使う際の設定として

・VBAの参照設定で「Microsoft DAO 3.6 Object Library」をON
・矢印を操作して「Microfoft Active X Data Object 2.1 Library」より上位に位置させる

の2点はしてあります。

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : イケガミ  ■日付 : 04/1/15(木) 13:40  -------------------------------------------------------------------------
   > 今度はSQLのInsert文がうまく流れないようです。
ロールバックされているってことじゃないんですか?

> flg = 1

>   If flg = 1 Then
>     ' ロールバック
>     wks.Rollback

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : 豆っち  ■日付 : 04/1/15(木) 13:52  -------------------------------------------------------------------------
   >ロールバックされているってことじゃないんですか?
すみません、言葉足らずでした。
テスト時には
・ロールバックにブレークポイントを置き、実行してテーブルの内容を確認
・flgの値は2にし、処理を終了させてからテーブルの内容を確認
の2点を行いました。
ですがどちらの場合もテーブル1にデータは反映されませんでした。

イケガミさんの口ぶりから察するにどうやらExecuteの使い方はあってるみたいですね。
他の処理部分をもう少し掘り下げて調べてみようと思います。

 ───────────────────────────────────────  ■題名 : Re:データのRollbackについて  ■名前 : 豆っち  ■日付 : 04/1/15(木) 16:26  -------------------------------------------------------------------------
   すみません、自己解決しました。
処理の最後に
  db.Close
を入れないとコミットは成功してもテーブルにデータは反映されないのですね。
イケガミさん、どうもありがとうございました!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 484