トランザクションを使用して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環境です。
はい。閉じてはいけません。
フォームの Recordset オブジェクトにアプローチ可能な状態では
同時に、上位オブジェクト Database のインスタンスも生成されています。
DAO のオブジェクトモデルでは
フォームのセッションで参照された Database オブジェクトも
Workspace オブジェクトの下位オブジェクトであり、
上位オブジェクトが Close メソッドを呼び出した時点で
それに連なる下位オブジェクトの参照は全て破棄されることになります。
# 提示いただいた cmd_ReSet_Click のコードに
# タイプライブラリ 及び オブジェクト間の上下関係・階層構造を明示しました。
cmd_Count ボタンを押した直後に cmd_ReSet ボタンを押すと
★★★ の実行結果において
1つだけに思える Database オブジェクトの数が
実際は
( フォームで生成された )カレントデータベースの別インスタンス
( Workspaceのインスタンス生成と共に参照された )カレントデータベースの開いているコピー
の2つになっていて
共に wks オブジェクト変数の管理下になっていることが確認できるでしょう。
なるほど、元から存在してるものに対し、使用することで名前を定義し、それに対してCloseしちゃってるのですね。
閉じずに放置することにします。
ありがとうございました。