Microsoft Access 掲示板

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

2 コメント
views
4 フォロー
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 オブジェクト変数の管理下になっていることが確認できるでしょう。

通報 ...