MS-ACCESSからMYSQLへエクスポート

①MYSQLのODBCドライバー(32ビット版)をインストし、ユーザDSNにOBCD接続を設定。
※【detaile】ボタンを押し以下を追加。文字化けしないように・・・(多分これでOK)
charsetにsjis cp932
Initial statementにset character set sjis cp932
※sjisを使うと特定の文字データで失敗することがある。例えば㈱等
②MDBファイルを開き、指示に従いOFFCIDE365のACCDBファイルにコンバート。ACCESSがエラるけど(゚ε゚)キニシナイ!!。
③以下のマクロをVBAに作成して実行し、テーブルをODBC接続でMYSQLにエクスポートする。※リンクテーブルは失敗するかもしれない。

Attribute VB_Name = "ODBCエクスポート"
Option Compare Database
Dim DSN As String
Dim データベース名 As String
Dim ユーザID As String
Dim パスワード As String
Dim odbcSet As String
Dim サーバー As String
Public Sub テーブルをMYSQLのデータベースへエクスポートする()
Dim テーブル名 As String
Dim tbldef As TableDef
Dim 追加したテーブル() As String
Dim 追加できなかったテーブル() As String
Dim 既に存在していたテーブル() As String
'----------------------------
DSN = "ODBC接続名"
データベース名 = "データベース名"
ユーザID = "ユーザID"
パスワード = "パスワード"
サーバー = "サーバー名"
'----------------------------
odbcSet = "ODBC;DSN=" & DSN & ";UID=" & ユーザID & ";PWD=" & パスワード & ";"
Call テーブル差し戻し
For Each tbldef In CurrentDb.TableDefs
    テーブル名 = tbldef.Name
    Dim nn As Integer
    ' MSテーブルを除く
    If Left(テーブル名, 2) <> "ms" Then
    If Left(tbldef.Name, 6) <> "オリジナル_" And Left(tbldef.Connect, 4) <> "ODBC" Then
        On Error Resume Next
        Err.Clear
        DoCmd.TransferDatabase acExport, "ODBC データベース", odbcSet, _
            acTable, テーブル名, テーブル名, False
        Select Case Err.Number
        Case 0:
            Call テーブル差し替え(テーブル名)
            Call 配列に追加(追加したテーブル, テーブル名)
        Case 3146:
            '既にある
            MsgBox Err.Description
            Call テーブル差し替え(テーブル名)
            Call 配列に追加(既に存在していたテーブル, テーブル名)
        Case Else:
            Call 配列に追加(追加できなかったテーブル, テーブル名)
        End Select
        '
    End If
    End If
    DoEvents
Next
MsgBox "終了" & vbCrLf & "【追加したテーブル】:" & vbCrLf & Join(追加したテーブル, ",") & vbCrLf & "【追加できなかったテーブル】:" & vbCrLf & Join(追加できなかったテーブル, ",") & vbCrLf & "【既に存在していたテーブル】:" & vbCrLf & Join(既に存在していたテーブル, ",")
End Sub
Private Sub テーブル差し替え(テーブル名)
    '
    On Error Resume Next
    CurrentDb.TableDefs(テーブル名).Name = "オリジナル_" & テーブル名
    'DoCmd.TransferDatabase acLink, "ODBC データベース", odbcSet, _
    '        acTable, テーブル名, テーブル名
    Dim dbs As Database
    Set dbs = CurrentDb
    Dim tdf As TableDef
    Set tdf = dbs.CreateTableDef(テーブル名)
    tdf.Connect = odbcSet
    tdf.SourceTableName = テーブル名
    dbs.TableDefs.Append tdf
    dbs.TableDefs.Refresh
    Set dbs = Nothing
End Sub
Public Sub テーブル差し戻し()
    '
    On Error Resume Next
    Err.Clear
    Dim テーブル名 As String
    For Each tbldef In CurrentDb.TableDefs
        If Left(tbldef.Name, 6) = "オリジナル_" Then
            テーブル名 = Mid(tbldef.Name, 7)
            DoCmd.DeleteObject acTable, テーブル名
            tbldef.Name = テーブル名
        End If
    Next
End Sub
Public Sub テーブルチェック()
    '
    Dim テーブル名 As String
    Dim tbldef As TableDef
    For Each tbldef In CurrentDb.TableDefs
        テーブル名 = tbldef.Name
        ' MSテーブルを除く
        If Left(テーブル名, 2) <> "ms" Then
            MsgBox tbldef.Name & vbCrLf & tbldef.Connect
        End If
    Next
End Sub
Private Sub 配列に追加(aaa() As String, tbl As String)
On Error Resume Next
Err.Clear
Dim nn As Integer
nn = 0
nn = UBound(aaa)
If nn = 0 Then
    nn = nn + 1
    ReDim Preserve aaa(nn)
    aaa(0) = tbl
Else
    If aaa(nn) = "" Then
        aaa(nn) = tbl
    Else
        nn = 0
        nn = UBound(aaa)
        nn = nn + 1
        ReDim Preserve aaa(nn)
        aaa(UBound(aaa)) = tbl
    End If
End If
End Sub

ところが、DoCmd.TransferDatabaseは、テーブルにプライマリーキーを付けないという恐ろしい仕様になっているので、UPDATEやDELETE操作がうまくいかない。
このため、SQLツールでちょっとデータをいじると、即!"指定されたテーブルから削除できませんでした。" というエラー メッセージに出会うことになってしまう。
⓸以下のマクロをVBAに作成し、実行してテーブルやリンクテーブルを先のOBCD接続に変更する。(後日予定)




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA