こんにちは。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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/07/07 08:37
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
-
4
ASP レコードセットしたオブジェクトを戻り値に出来ませんか?
Microsoft ASP
-
5
SQLの速度をあげるには・・・
Visual Basic(VBA)
-
6
ACCESS──メインフォームでサブフォームのレコード件数をカウントしたい
Access(アクセス)
-
7
エラー(型が一致しません。)の対処方法
Visual Basic(VBA)
-
8
ACCESS ADOでupdateが効かない
その他(データベース)
-
9
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
10
フォーム上の現在アクティブなコントロールの取得
Access(アクセス)
-
11
もしフォームヘッダーにコントロールがあるのなら
Access(アクセス)
-
12
参照設定は2.8と6.0 6.1とどちらにチェッ
その他(Microsoft Office)
-
13
カレントレコードが無い事を判定させる方法
Visual Basic(VBA)
-
14
[ASP+SQL]絞込み済みのレコードセットを一気に計算、SUM?
Microsoft ASP
-
15
Access 最後のレコードに到達するまでループ処理を行う方法
Access(アクセス)
-
16
VBで構造体の配列を関数に渡す方法?
Visual Basic(VBA)
-
17
ACCESSのBookmarkプロパティの使い方
その他(データベース)
-
18
ADOのCursorLocationプロパティ
Visual Basic(VBA)
-
19
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
20
access の 最終レコードの判定はどう記述しますか
Access(アクセス)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java認定試験3級の問題です。 ...
-
C#でフォームのオブジェクト名...
-
直線と点の距離を使って当たり...
-
オブジェクト名をforループ内で...
-
ヘッダファイルにおける文字列...
-
Listに格納されているオブジェ...
-
java utf-8 で ファイル出力
-
VBからBATファイルを起動して戻...
-
Vbで通常使用するプリンターを...
-
写真が合成か調べる方法
-
サブクラス化
-
ビジュアルC++でボタンの有...
-
Excelで =EMBED("Acrobat Docu...
-
SQLException
-
Javaの問題なんですが、(this==...
-
パワーポイントのVBAでテキスト...
-
COMコンポーネントって何?
-
戻り値がクラスオブジェクト
-
時間帯判定をする。
-
0埋めについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
JAVAからHTMLへ値を返す方法
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
Object型からDouble型へのキャスト
-
ビジュアルC++でボタンの有...
-
COMコンポーネントって何?
-
LISTBOXの内容が更新されま...
-
Vbで通常使用するプリンターを...
-
多人数のじゃんけんプログラム
-
オブジェクト名をforループ内で...
-
ASP.net 教えてください!!(...
-
JSPのout.printについて
-
時間帯判定をする。
-
error C2712: オブジェクト ア...
-
Accessの連結・非連結オブジェ...
おすすめ情報