
こんにちは。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
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レコードセットではない為)
今作ってるモノの規模により、臨機応変にメンテし易い最小限規模を選択してコード化
すればいいと思います。
勉強なら、最初は簡単な規模から、徐々に色んな場面に対応できる規模の大きいものへと
極めるのもいいでしょう。
わかりやすいコードありがとうございます。とても勉強になりました。仕事でAccessを使っていたのですが、考え方の幅が広がりました。本当にありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Java】入力した西暦→和暦に変...
-
Excelで =EMBED("Acrobat Docu...
-
ビジュアルC++でボタンの有...
-
パワーポイントのVBAでテキスト...
-
ワイルドカード<?>と型パラメー...
-
時間帯判定をする。
-
bmp画像をjpegやpng画像に圧縮...
-
newは明示的にした方が良いのか?
-
EXCEL VBAにて動的にCheckBOXを...
-
ワードで画像をドロップすると...
-
C#でフォームのオブジェクト名...
-
エクリプス コンテンツアシスト...
-
二段階でインスタンス化する必...
-
JAVAからHTMLへ値を返す方法
-
開始日(Date型)から終了日(Date...
-
VBAからノーツを起動
-
AccessからMSペイントを起動さ...
-
JSPのout.printについて
-
マルチプルインスタンスのメリット
-
CoCreateInstanceでエラーになる。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
パワーポイントのVBAでテキスト...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
Object型からDouble型へのキャスト
-
時間帯判定をする。
-
C++で*thisは何を指しているの...
-
ワイルドカード<?>と型パラメー...
-
Accessの連結・非連結オブジェ...
-
COMコンポーネントって何?
-
newは明示的にした方が良いのか?
-
ビジュアルC++でボタンの有...
-
CoCreateInstanceでエラーになる。
-
ResultSet での問題
-
多人数のじゃんけんプログラム
-
printerオブジェクトでのテキス...
-
サーブレットのクラス図について。
-
VBSでのステートメントの末尾が...
おすすめ情報