アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。ADOについてお教えください。
フォームをロード時に接続プロシージャと切断プロシージャを走らせたいと思います。
ConnectDatabaseを呼び出しは成功しますが、CloseDatabase呼び出しには失敗します。

スコープの問題で、rs、cnのオブジェクトが無い為だと思います。
ConnectDatabaseで作成されたcn、rsオブジェクトを別の関数で処理するにはどのようにコードをかけばよろしいでしょうか?宜しくお願い致します。

Private Sub Form_Load()

Call ConnectDatabase
Call CloseDatabase

End Sub

Module1
------------------
sub ConnectDatabase()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
処理~~~~
end sub


sub CloseDatabase()

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

end sub

A 回答 (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レコードセットではない為)


今作ってるモノの規模により、臨機応変にメンテし易い最小限規模を選択してコード化
すればいいと思います。
勉強なら、最初は簡単な規模から、徐々に色んな場面に対応できる規模の大きいものへと
極めるのもいいでしょう。
    • good
    • 1
この回答へのお礼

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

お礼日時:2013/05/29 23:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A