• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ADO オブジェクトの渡し方)

ADOオブジェクトの渡し方

このQ&Aのポイント
  • ADOについてお教えください。フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。
  • ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。スコープの問題で、rs、cnのオブジェクトが無い為だと思います。
  • ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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レコードセットではない為) 今作ってるモノの規模により、臨機応変にメンテし易い最小限規模を選択してコード化 すればいいと思います。 勉強なら、最初は簡単な規模から、徐々に色んな場面に対応できる規模の大きいものへと 極めるのもいいでしょう。

mellow91
質問者

お礼

わかりやすいコードありがとうございます。とても勉強になりました。仕事でAccessを使っていたのですが、考え方の幅が広がりました。本当にありがとうございます!