Access 覚書  --  データベース操作関連

1.他のデータベースへのリ ンクをチェックする
  データ用のデータベーとのプログラム用データベースを分離した場合、ディレクトリを移動したり他のマシンにコピーするとテーブルへのリンクが引き継がれ ず、毎回「リンクテーブルマネージャ」で再度リンクしなおさなければなりません。
  その不便さを解消するため に、起動時にデータ用のデータベースの存在を確認し、存在すればリンクを張りなおすルーチンを作ってみました。データ用テーブルがない場合にはエラーメッ セージを表示します。  エ ラーが返されたら、プログラムを終了するなどの処理をつけておくと便利です。
  以下のサンプルコードはプログラム用データベースのデータ用データベースを同一ディレクトリの置くことを基本にしています。
 ' データベースリンクチェック

Public Function CheckLink() As Boolean
Dim obj As DAO.TableDef        ' テーブル定義オブジェクト
Dim strDBName As String        ' プログラムデータベースフルパス
Dim strDir  As String            ' 現在のリンク先
Dim strDir1 As String            ' データ用データベースのディレクトリ
Dim strConn As String        ' 接続文字列

On Error GoTo ERRTRAP

    ' プログラムデータベースのフルパス取得
    strDBName = CurrentDb.Name
    ' ディレクトリの切り出し
    strDir1 = Mid(strDBName, 1, Len(strDBName) - Len(Dir(strDBName)))

    ' データ用データベースの存在確認
    If Dir(strDir1 & "TestData.mdb") = "" Then

        ' 存在しない場合はエラーメッセージを表示して終了
        MsgBox "データ保存用データベースがありません", vbOKOnly, "データベースエラー"
        CheckLink = False
        Exit Function
    End If
   
    ' データベースが存在した場合はリンク先をチェックする。
    For Each obj In CurrentDb.TableDefs

        ' Connectプロパティを調べてリンクテーブルのみを対象にする。
        If obj.Connect <> "" Then

            ' 先頭の「;DATABASE=」を取り除く
            strDir = Mid(obj.Connect, 11, Len(obj.Connect) - 10)
            ' ファイル名を取り除いてディレクトリ部分のみとする
            strDir = Mid(strDir, 1, Len(strDir) - Len(Dir(strDir)))

            ' 現在のリンク先ディレクトリとプログラムデータベースのディレクトリを比較
            If strDir <> strDir1 Then

                ' 異なっていればリンク先を訂正する
                strConn = ";DATABASE=" & strDir1 & "TestData.mdb"
                obj.Connect = strConn
                obj.RefreshLink
            End If
        End If
    Next

    CheckLink = True
    Exit Function
   
ERRTRAP:
    MsgBox Err.Description, vbOKOnly, "CheckLink"
    CheckLink=False
End Function


2. データベースをバックアップする。 Access mdbの場合 DAOを使用
 mdbデータベースをプログラムmdbから操作してバックアップする。
最適化関数 DBEngine.CompactDatabaseを使用している。
バックアップ先のファイル名は「年、月、日、時、分、秒」を付加している。
' データベースバックアップ

Public Function fBackUp(strPath As String) As Boolean
Dim strCompDB As String
Dim strDir1 As String
Dim strBaseDB As String

On Error GoTo ERRTRAP

    strCompDB = strPath & "\TestData" & Format(Now, "yyyymmddhhnnss") & ".mdb"
    strDir1 = CurrentDb.Name
    strDir1 = Mid(strDir1, 1, Len(strDir1) - Len(Dir(strDir1)))
    strBaseDB = strDir1 & "TestData.mdb"
   
    DBEngine.CompactDatabase strBaseDB, strCompDB
   
    fBackUp = True
    Exit Function
   
ERRTRAP:
    MsgBox Err.Description, vbOKOnly, "fBackUp"
    fBackUp=False

End Function


3. データベースをバックアップする。 Access adpの場合 SQLServerを使用
 adp形式のAccessプログラムでリンク先のSQLServerデータベースをバックアップする。
T-SQLのBACKUPコマンドを使用している。
このバックアップはディスクに対して全体バックアップを行う。
一部ファイルのみをバックアップする場合や差分バックアップでは指定が異なる。
' データベースバックアップ関数
Public Function fDBBackUp(strPath As String) As Boolean
    ' strPath = バックアップ先のディレクトリ

Dim strSQL As String

On Error GoTo ERRTRAP
   
    Call SetCon

    ' cDBName = バックアップするデータベース名
    ' cBackUpFile = バックアップファイル名
    ' cBackUpName = バックアップセットの名前
   
    strSQL = "BACKUP DATABASE [" & cDBName & "] TO  DISK = N'"
    strSQL = strSQL & strPath & "\" & cBackUpFile & "' WITH  NOINIT ,  NOUNLOAD , "
    strSQL = strSQL & "Name = N'" & cBackUpName & "',  NOSKIP ,  STATS = 10,  NOFORMAT "
    con.Execute strSQL
   
    Call CloseCon
    DoEvents
    fDBBackUp = True
   
    Exit Function
ERRTRAP:
    MsgBox Err.Number & " " & Err.Description, vbOKOnly, "fDBBackUp"
   
    fDBBackUp = False

End Function


4.VBAの編集時、文字列置換ダイアログで日本語を入力すると 文字化けする。
 変換元、変換後どちらも、テキストエディタなどを使って必要な文字列を入力。それをコピー&ペーストでコンボボックスに貼り付ける。