VB6.0のADOで社内LAN上のサーバー(共有PC)内のデータベースファイル(Accesss2003のmdbファイル)へ接続、データ登録を行なっていますが、接続を閉じる際にcn.Close以降の処理で30秒近い時間がかかっています。
昼休み等で接続するユーザーがいない場合も処理時間がかかっています。
テストの為、同じmdbファイルをコピーし、別名のファイルに接続するように変更した場合は
1秒程度で終了します。(下記ソースの(1)と(2)を入れ替え)
データ数は約2000件、ファイル容量17MB
接続するユーザーは最多で10名程度、各クライアントのPCで下記コードのEXEファイルを実行して
接続、データ登録しています。
原因、対策案等をご教授ください。
----------------------------------------
Public Sub DB_ACCESS()
Dim cn As ADODB.Connection
Dim RS As ADODB.Recordset
Set cn = New ADODB.Connection
Set RS = New ADODB.Recordset
Debug.Print "TEST-1: ", Time
Access_DB_Source_File = "\\PC-SERVER\DB\Data_File.mdb" ---------- (1)
'Access_DB_Source_File = "\\PC-SERVER\DB\Data_File_Test.mdb" ---------- (2)
cn.ConnectionString = _
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source = " & Access_DB_Source_File & _
";Jet OLEDB:Database Password=otakast2061;"
cn.Open
'この部分にデータ参照、登録等を行う処理が入る。
' RS.Close
Debug.Print "TEST-2: ", Time
cn.Close
Set RS = Nothing
Set cn = Nothing
Debug.Print "TEST-3: ", Time
End Sub
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ここにも勘違いしてる人が...
ACCESS をそんな使い方してはいけません。
ACCESS はパーソナルデータベースツールです。
いますぐSQLServerに替えましょう。
(無料版もあるようです)
http://okwave.jp/qa/q7102641.html
No.2
- 回答日時:
>データ数は約2000件、ファイル容量17MB
mdbを最適化して下さい。
たった2000件で17MBって事は、大量のゴミがmdbの中にあります。
クローズ時には、このゴミ部分もデータ走査の対象になり、クローズに時間を要します。
一連の処理が終わったら、
DBEngine.CompactDatabase "\\PC-SERVER\DB\Data_File.mdb", "\\PC-SERVER\DB\Data_File_New.mdb"
Kill "\\PC-SERVER\DB\Data_File.mdb"
Name "\\PC-SERVER\DB\Data_File_New.mdb" As "\\PC-SERVER\DB\Data_File.mdb"
の3行を実行しましょう(但し、他のユーザーがアクセスしていない場合のみ実行すること)
1行目で、\\PC-SERVER\DB\Data_File.mdbを最適化して\\PC-SERVER\DB\Data_File_New.mdbに出力します。
2行目で、最適化前の\\PC-SERVER\DB\Data_File.mdbを削除します。
3行目で、最適化後の\\PC-SERVER\DB\Data_File_New.mdbを\\PC-SERVER\DB\Data_File.mdbにリネームします。
この3行が必ず実行されれば、データベースが最適化された状態を保持します。
この回答への補足
早速の回答ありがとうございました。
1つ確認させてください。
ご教授頂いた最適化の処理は、Accessのツール内の最適化処理と同じことでしょうか?
試しに両方実行してみましたが、ファイル容量は600KB程少なくなった程度でした。
先日、Accessのツール内の最適化処理を行っています。
あと、件数自体は記載間違いで2000件ではなく、20000件でした。
大変失礼しました。
同じ程度の件数のテーブルが2つあります。
よろしくお願いいたします。
No.1
- 回答日時:
Data_File_Test.mdb
上記のファイルはデータ数が少ないと推定します。
mdbの仕様上、解放直前にデータを書き込むので仕方がないと思います。
ただ、フィールド数とフィールド長がわからないものの、2000件のデータで
17MBは大きすぎるように思います。
MDBはファイルを削除したり移動したりするごとに肥大化していきます。
たとえば、データを削除してもそのデータが実際に無くなるのではなくて、
削除フラグが付くだけですのでデータは小さくなりません。
たまに「最適化」するとデータが小さくなります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで巨大なファイルの途中から...
-
2つのCSVファイルをマッチング
-
openした後、closeしないでプロ...
-
VBScriptでファイル保存先のデ...
-
ReadLineでの読み出し行を指定する
-
ExcelをCSV書き出す場合のシー...
-
MATLAB グローバル変数の宣言
-
perl内でPHPを動かす?
-
C#でCSVファイルを逐一更新したい
-
VB6.0でDB接続する際に切断時の...
-
ファイル処理について
-
VBAでCSVファイルの特定行を書...
-
ファイル全てを .xlsm に変更し...
-
ファイル名を複数個配列で確保...
-
エクセルVBAで素数だけを出力す...
-
Firefox で file:// で始まる U...
-
fopenでディレクトリ内の全ファ...
-
巨大ファイルの行をを逆順に並...
-
CSVファイルをperlプログラムで...
-
perl ファイルが開かない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ReadLineでの読み出し行を指定する
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
エクセルVBA コードが同じでも...
-
Perlの変数に文字数制限(容量...
-
perlで、後ろの行を読んで、前...
-
2つのCSVファイルをマッチング
-
C言語でのファイルのデータ更...
-
VB6.0でDB接続する際に切断時の...
-
CSVが可変長の場合の検索方法
-
perlで容量の大きいCSVファイル...
-
1ファイルずつ読み込みたい
-
VBScriptでファイル保存先のデ...
-
C#でCSVファイルを逐一更新したい
-
perl で googleAPIを呼び出す...
おすすめ情報