Microsoft Access 掲示板

WorkSpaceは閉じなくても問題ないのか

2 コメント
views
4 フォロー

トランザクションを使用してWorkSpaceを閉じると、
フォームのRecordsetが使用できなくなります。

【テーブル】
M_USER, W_USER
・ID(主キー)
・氏名
・生年月日

【フォーム】
F1
・ソース:M_USER
・ボタン:cmd_Count
・ボタン:cmd_ReSet
・コード

Private Sub cmd_Count_Click()
  MsgBox Me.Recordset.RecordCount
End Sub

Private Sub cmd_ReSet_Click()
  Dim db As Object
  Dim qfd AsQueryDef
  Set db = CurrentDb

On Error GoTo ErrorHandler
'  Dim wks As Workspace
'  Set wks = DBEngine.Workspaces(0)
'  wks.BeginTrans

  Set qdf = db.QueryDefs("Q1")
  qdf.sql = "DELETE * FROM M_USER"
  qdf.Execute

  Set qdf = db.QueryDefs("Q1")
  qdf.sql = "INSERT INTO M_USER SELECT * FROM W_USER"
  qdf.Execute

'  wks.CommitTrans

  db.Close
  Set db = Nothing
'  wks.Close     '<---WorkSpaceのClose
'  Set wks = Nothing

  Exit Sub

ErrorHandler:
'  wks.Rollbck
End Sub

[1]Countボタン→[2]ReSetボタン→[3]Countボタンと操作したとき、
トランザクションがない場合は[1]も[3]も表示されますが、
トランザクションを有効化した場合は[3]がエラーになります。
また、以下の方法で設定しているグループ情報も使えなくなります。
コントロールをグループ化して操作する

WorkSpaceを閉じなければエラーは出ないのですが
これは閉じなくても問題がないものなのでしょうか?

なお、[1]ReSetボタン→[2]Countボタン→[3]ReSetボタン→[4]Countボタンと操作した場合、[2]は表示されますが[4]でエラーとなります。
単純にWorkSpaceを閉じることが問題ではない??

当方Win10+Access2016環境です。

朱色
作成: 2019/12/26 (木) 18:53:38
通報 ...
1
mayu 2019/12/27 (金) 09:53:03 修正 9b175@61ad5

WorkSpaceを閉じなければエラーは出ないのですが
これは閉じなくても問題がないものなのでしょうか?

はい。閉じてはいけません。

フォームの Recordset オブジェクトにアプローチ可能な状態では
同時に、上位オブジェクト Database のインスタンスも生成されています。

DAO のオブジェクトモデルでは
フォームのセッションで参照された Database オブジェクトも
Workspace オブジェクトの下位オブジェクトであり、
上位オブジェクトが Close メソッドを呼び出した時点で
それに連なる下位オブジェクトの参照は全て破棄されることになります。
 

Private Sub cmd_ReSet_Click()
    Dim wks As DAO.Workspace
    
    On Error GoTo ErrorHandler
    
    Me.Painting = False
    Me.RecordSource = vbNullString
    Set wks = Access.Application.DBEngine.Workspaces(0)
    MsgBox wks.Databases.Count   '★★★
        
    wks.BeginTrans
    
    With wks.Databases(0)
        .Execute "DELETE FROM M_USER"
        .Execute "INSERT INTO M_USER SELECT * FROM W_USER"
        .Close
    End With
    
    wks.CommitTrans
    wks.Close                    'この行は不要

ExitProc:
    Set wks = Nothing
    Me.RecordSource = "M_USER"
    Me.Painting = True
    Exit Sub
ErrorHandler:
    wks.Rollback
    MsgBox Err.Description
    Resume ExitProc
End Sub

# 提示いただいた cmd_ReSet_Click のコードに
# タイプライブラリ 及び オブジェクト間の上下関係・階層構造を明示しました。

cmd_Count ボタンを押した直後に cmd_ReSet ボタンを押すと
★★★ の実行結果において
1つだけに思える Database オブジェクトの数が
実際は

  ( フォームで生成された )カレントデータベースの別インスタンス
  ( Workspaceのインスタンス生成と共に参照された )カレントデータベースの開いているコピー

の2つになっていて
共に wks オブジェクト変数の管理下になっていることが確認できるでしょう。

2
朱色 2020/01/06 (月) 18:16:44 db0eb@be71c

なるほど、元から存在してるものに対し、使用することで名前を定義し、それに対してCloseしちゃってるのですね。
閉じずに放置することにします。
ありがとうございました。