Access + MySQL でシステムを稼働していて
定期的にMySQLデータをバックアップさせたいという要望があり
当初はメニュー画面にボタンを付けてと提案したのですが
画面終了時に毎回確認メッセージ表示してバックアップするしないを選択
させてバックアップをしたいという事でした。
でも何故か私の所では上手く動作しなくて(正しくバックアップファイル生成されない)
原因不明のままなのですが、お客様の環境では正常に動作しているというので
そのまま採用になりました。。
コードはこんな感じになりました。
メニューフォームのcloseイベント
Rem ---------------------------------------------------------------------------------- Rem Close/閉じる Rem ---------------------------------------------------------------------------------- Private Sub Form_Close() Dim sMsg As String On Error GoTo Error '=================== ' バックアップ '=================== sMsg = "バックアップを実行しますか?" If MsgBox(sMsg, vbInformation + vbYesNo + vbDefaultButton1, C_MSG_TITLE) = vbYes Then '*** バックアップ Call subDBBackUp End If ' access終了 ' Application.Quit DoCmd.Quit acQuitSaveNone Exit Sub Error: MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, C_MSG_TITLE End Sub
Rem ---------------------------------------------------------------------------------- Rem Click/終了 Rem ---------------------------------------------------------------------------------- Private Sub cmd終了_Click() DoCmd.Close End Sub </blockquote> <blockquote> Rem ---------------------------------------------------------------------------------- Rem 関数名 : subDBBackUp Rem 処理内容 : MYSQLのバックアップをします Rem 引 数 : なし Rem 戻り値 : なし Rem ---------------------------------------------------------------------------------- Public Sub subDBBackUp() Dim objShell As Object Dim strUser, strPass Dim strPath As String Dim strTimestamp As String Dim strCmd As String On Error GoTo ERR ' バックアップパス取得 strPath = ReadINI("BACKUP", "BACKUP_PATH") strUser = ReadINI("MYSQL", "DB_USER") strPass = ReadINI("MYSQL", "DB_PASS") Set objShell = CreateObject("WScript.Shell") strTimestamp = Replace(CStr(Now()), "/", "") strTimestamp = Replace(strTimestamp, " ", "") strTimestamp = Replace(strTimestamp, ":", "") strCmd = "mysqldump -u " & strUser & " -p" & strPass & " " & C_DB_NAME & ">" & strPath & C_DB_NAME & strTimestamp & ".dmp" objShell.Run "cmd /c " & strCmd, vbNormalFocus, True Set objShell = Nothing Exit Sub ERR: MsgBox "環境設定ファイルを確認してください。" + Chr$(10) + "バックアップに失敗しました。", vbCritical End Sub
Rem ---------------------------------------------------------------------------------- Rem 関数名 : ReadINI Rem 処理内容 : INIファイルの情報取得 Rem 引 数 : Section,Entry Rem 戻り値 : 無し Rem ---------------------------------------------------------------------------------- Public Function ReadINI(Section As String, Entry As String) As String Dim n As String * 255 Dim rc As Long rc = GetPrivateProfileString(Section, Entry, "", n, 255, MyPath & IniFileName) ReadINI = funLeftB(n, InStr(n, Chr(0)) - 1) End Function
ちなみにiniファイルは、
メモ帳に
[MYSQL] SERVER_NAME=localhost DB_NAME=hoge DB_USER=root DB_PASS=hoge DRIVER_NAME=MySQL ODBC 5.1 DRIVER [BACKUP] BACKUP_PATH=C:\prj\access1\SYSTEM_BACKUP\
を書いて保存時にXXX.iniとファイル名を指定してaccessと一緒のフォルダに入れます。
hogeの箇所は環境によって修正
これで自動バックアップはOKです。(細かいコード説明は省略します)
ODBCドライバのバージョンは各環境のに合わせてください。
iniファイル便利です。最近小規模システムでは採用すること多いです。
メリットは、DBの名前や環境をかえた時にvbaソースを修正しなくて良いこと
デメリットは、セキュリティ的に大丈夫なの?ということ
一応、iniファイル採用の際は、お客様に確認して導入していますが
小規模だとその方がむしろ納品しやすくて喜ばれます。
というのは、やっぱりお客様環境とは微妙に環境が違うので
パスとかもろもろ、自由に指定できるほうが便利といえば便利なんですよね。
用途に応じて、バックアップパスだけiniファイルに入れるとかでも
良いんじゃないかなって思います。
帳票出力する際のPDF出力パスとか、画像パスとか
VBA内の定数で定義するのもありだけど、定数よりiniファイルの方が
お客様も修正できるので便利ですね。
コメント