- ベストアンサー
ADOオブジェクトの渡し方
- ADOについてお教えください。フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。
- ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。スコープの問題で、rs、cnのオブジェクトが無い為だと思います。
- ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
メソッドの外でprivate定義すればいいと思いますが。 予めDB操作として分離できるならばADO操作をクラス化してしまえばいいです。 【Form.frm】 Private Sub Form_Load() Call ConnectDatabase Call CloseDatabase End Sub Private cn As ADODB.Connection Private rs As ADODB.Recordset Private Sub ConnectDatabase() ' 接続処理 End Sub Private Sub CloseDatabase() ' 切断処理 End Sub これだと、Form.frmの外(例えばForm2.frm)に行くと、またオブジェクトを生成し直す必要があります。 もしくは 【Form.frm】 Private Sub Form_Load() Dim db As DatabaseADODB Set db = DB.Get() Call db.ConnectDatabase() Call db.CloseDatabase() End Sub 【DatabaseADODB.cls】 Private cn As ADODB.Connection Private rs As ADODB.Recordset Public Sub ConnectDatabase() ' 接続処理 End Sub Public Sub CloseDatabase() ' 切断処理 End Sub 【DB.bas】 Private mDb As DatabaseADODB = Nothing Public Function Get() As DatabaseADODB If mDb Is Nothing Then Set mDb = New DatabaseADODB() End If Get = mDb End Function みたいにして、どこからでも唯一のDatabaseADODBオブジェクトを取得するようにすれば どこからでもアクセス可能になります。 が、レコードセットもDatabaseADODBクラス内に含める前提で書くと、レコードセットの リフレッシュ契機もシビアに考えてあげないとバグになります。 普通は、接続クラスとSQL発行クラス、レコードセットクラスが分かれるものなので。 (1接続に対して1レコードセットではない為) 今作ってるモノの規模により、臨機応変にメンテし易い最小限規模を選択してコード化 すればいいと思います。 勉強なら、最初は簡単な規模から、徐々に色んな場面に対応できる規模の大きいものへと 極めるのもいいでしょう。
お礼
わかりやすいコードありがとうございます。とても勉強になりました。仕事でAccessを使っていたのですが、考え方の幅が広がりました。本当にありがとうございます!