質問の経緯
5年ほど前、前任者からACCESS-VBAの業務システムを引き継ぎ現在に至ります。
当該業務システム利用中に突然エラーが発生することが稀に発生していました。
「オブジェクト変数またはWithブロック変数が設定されていません」というエラーだったと
記憶しております。
原因と思しき箇所を改修後、同エラーは発生しなくなりましたが、改修前のRecordsetオブジェクトの
受け渡し方が本当に誤りなのか自信がなく質問させて頂いた次第です。
エラーの傾向
- 同日何度も実行している業務ロジックで突然エラーが発生する。
- エラーが発生する業務ロジックは複数あるが、ロジックに特徴がある。(後述)
- 業務システム(ACCESS)を再起動して全く同じ操作を実施すると問題なく終了する。
エラーが発生する業務ロジックの特徴
コードイメージは必要最低限、その他はコメントで表現します。
'---------------------------------------------------- 'SQLServerに接続しSELECT実行結果を戻り値で返す孫関数 '---------------------------------------------------- Private Function Select実行() As ADODB.Recordset Dim db As New ADODB.Connection db.Open "~SQLServer接続文字列~" Set Select実行 = db.Execute("~SQL(SELECT文)~") End Function '---------------------------------------------------- 'SELECT結果をフォームに表示する子サブルーチン '---------------------------------------------------- Private Sub Select結果画面表示(rs As ADODB.Recordset) Do Until rs.EOF '取得したレコードに対して各カラム値をフォームに出力する処理 rs.MoveNext Loop End Sub '---------------------------------------------------- 'フォームの検索ボタンクリック時、イベントプロシジャから '呼び出される親サブルーチン '---------------------------------------------------- Public Sub 検索処理() Call Select結果画面表示(Select実行) End Sub
疑問事項
- SQLServerへの接続は孫関数で行っているが、コネクションを解放していない。
⇒ここで解放してしまうと、呼び元のSelect結果画面表示がレコードセットに
アクセスできないと理解。
- 上位のサブルーチンではこのコネクションを解放する術がない。
自分は正しいコードと思えませんでした。
改修概要
- 親サブルーチン(検索処理)でSQLServer接続を行い、コネクションオブジェクトを孫関数に渡す。
- Select結果画面表示が終わったらコネクションを解放する。
以上の改修を行ってから、同事象は発生しなくなりました。
一応の自己解決。
確認して頂きたいこと
- 改修前のコードは間違っているという判断で良いでしょうか?
- 上記以外に改修案がありましたらご教示頂きたく。
補足情報(FW/ツールのバージョンなど)
OS:Windows7 / Windows10
ACCESS:Office2010 / Office365(1902)
DB:SQLServer2008R2
おわりに
記載していない業務ロジックに不具合がある可能性も重々承知しておりますが、改修前のようなRecordsetオブジェクトの渡し方についての是非についてコメントを賜りたく投稿しました。
よろしくお願い致します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/28 06:13