Access データベースまたは Access プロジェクト内のデータやオブジェクトを削除すると、断片化が発生し、ディスク領域の使用効率が低下する可能性があります。同時に、データベース ファイルのサイズは減少せず、ハード ディスクの容量がなくなるまで増加し続けます。何か良い対処法はあるでしょうか?実際、Access では、データベースを圧縮して最適化し、Access データベースと Access プロジェクトのパフォーマンスを向上させることができます。このような圧縮処理の本質は、ファイルをコピーし、ディスク上にファイルを保存する方法を再編成することです。ただし、Access プロジェクトでのこのような圧縮は、データベース オブジェクト (テーブルやビューなど) には影響しません。これは、データベース オブジェクトは Access プロジェクト自体ではなく Microsoft SQL Server データベースに保存されるためです。同様に、このような圧縮は、Access プロジェクトの自動番号付けには影響しません。 Access データベースでは、テーブルの末尾からレコードが削除されている場合、データベースを圧縮すると自動番号付けの値がリセットされます。追加される次のレコードの自動番号の値は、テーブル内の削除されなかった最後のレコードの自動番号の値より 1 大きくなります。以下では、VB で CompactJetDatabase プロセスを使用して Access データベース ファイルを圧縮する方法について説明します。このプロセスには、圧縮前に元のデータベース ファイルを一時ディレクトリにバックアップする必要があるかどうかを示すオプションのパラメータがあります (True または False)。 。この方法を使用して、21.6MB のデータベースをわずか 300KB に圧縮しました。
'これらのコードはモジュールに配置し、他の形式で使用できます
Public Declare Function GetTempPath Lib "kernel32" Alias _
"GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Const MAX_PATH = 260
Public Sub CompactJetDatabase(Location As String, Optional BackupOriginal As Boolean = True)
On Error GoTo CompactErr
Dim strBackupFile As String
Dim strTempFile As String
'データベース ファイルが存在するかどうかを確認します
If Len(Dir(Location)) then
' バックアップが必要な場合は、バックアップを実行します
If BackupOriginal = True then
strBackupFile = GetTemporaryPath & "backup.mdb"
If Len(Dir(strBackupFile)) then Kill strBackupFile
FileCopy Location, strBackupFile
End If
'一時ファイルを作成しますname
strTempFile = GetTemporaryPath & "temp.mdb"
If Len(Dir(strTempFile)) then Kill strTempFile
'DBEngine を通じてデータベース ファイルを圧縮します
DBEngine.CompactDatabase Location, strTempFile
'元のデータベース ファイルを削除します
Kill Location
'コピーが圧縮されました。一時データベース ファイルが元の場所
FileCopy strTempFile, Location