ODBCドライバをMySQLからMariaDBに差替
昔データベースをMySQLからMariaDBに差し替えたのですが、エクセルのVBAで使っていたODBCドライバがMySQLのままだった事にいまさらながらに気づきました。
なんの問題もなく使えているのですが、MariaDBが徐々に独自路線で歩みを進めているようにも感じらる今日この頃、いいきっかけなのでODBCドライバを差し替えることにしました。
MariaDBのODBCドライバのダウンロード
MariaDBのウェブページは、mariadb.orgとmariadb.comのふたつが存在するようです。前者はFoundation(財団)で公社はCorporation(会社)のものだと思われます。
Windows用のODBCドライバのバイナリは、mariadb.com側にのみ存在しましたのでそちらからダウンロードしてインストールします。OSやアーキテクチャ(32/64)は環境にあったものを選択してください。
今回筆者はMS Office2019のVBA用に利用したかったのですが、ダウンロードするODBCドライバのバージョンは32bit版を使うことになりました。OSは64bitなのですが、Officeは32bit版なのがその理由です。
ちなみにOffice2019でアプリのアーキテクチャを確認するには、「ファイル」→「その他」→「アカウント」→「Word/Excelのバージョン情報」と進めると出てきます。
VBAでの接続文字列
接続文字列をVBAのコード内に直接記述する場合は、ダウンロードファイルをインストールすれば利用できるようになります。
その際のサンプルは次のようになります。3.1の箇所はバージョンに合わせた記述をしてください。ほぼMySQLの時と同じで、文字列をMariaDBにしてバージョンを変えるだけでした。
Public Function openMariaDB(cnn As ADODB.Connection, strServerIp As String, strDataBaseName As String, strUser As String, strPass As String) As Boolean
On Error GoTo errorh
Set cnn = New ADODB.Connection
cnn.Open "driver={MariaDB ODBC 3.1 Driver};SERVER=" & strServerIp & ";DATABASE=" & strDataBaseName & ";UID=" & strUser & ";PWD=" & strPass
openMariaDB = True
Exit Function
errorh:
MsgBox Err.Description, , "エラー"
openMariaDB = False
End Function
また、MS Azureで使う際の記法は次のように紹介されていました。SSLで接続する際にはこちらを参考にしてください。
DRIVER={MARIADB ODBC 3.0 Driver}; Server="{your_host}"; Port=3306; Database={your_database}; Uid="{username@servername}"; Pwd={your_password}; sslca={ca-cert filename}; sslverify=1;
データソースに登録するには、「管理ツール」からアーキテクチャを選択して管理画面を立ち上げ、「新規」を選んで作成します。ドライバーをインストールすることで新規作成の候補にMariaDBのドライバが含まれていると思います。
そもそもODBCとは
VBAを使っていると、ODBCをはじめDAOやADO、OLEDBと似たような技術が出てくるのでついでに整理しておきます。
ODBC(Open Database Connectivity)はデータベースとアプリケーションを仲介するドライバで、完璧ではないものの接続先のデータベースの種類の違いを吸収してくれるものです。
似たような技術にDAO(Data Access Object)やOLE-DBがあります。
DAO(Data Access Objects)はマイクロソフトのデータベースアクセス用のAPIですが、こちらはバージョン3.6で終了した古い技術です。
なので通常VBAなどではその後継?であるADO(ADODB)を使います。上記のコードでも利用しているADODBはマイクロソフトが提唱したプラットフォーム非依存の技術であるCOM(Component Object Model)のひとつです。コード内ではODBCドライバを呼び出していますが、内部ではさらにそれをOLEDBが仲介しています。
OLE(Object Linking And Embedding)は、マイクロソフトが開発したオブジェクトをやり取りするための仕組みで、元は複合文書を分割して編集したり、ドラッグアンドドロップやクリップボードでのアプリケーション間でのデータのやりとりにも使われています。 OLEDBはそのDB版です。データベースがOLEDBに対応していれば、先のようにADODB経由ではなく、直接OLEDBのAPIを使って操作することもできます。
ちなみにVBAの参照設定等に出てくるOCX(OLE Control Extension)はOLEの拡張版を意味します。
Microsoft.Jet.OLEDB.4.0も64bit環境では使えない
ついでにもう一つ。同じVBAでMDBファイルへの接続をMicrosoft.Jet.OLEDB.4.0経由で使っていたのですが、これが64bit環境では使えなくなるそうです。Officeは32ビットなので問題ないのですが今後のためにこちらも変更しておきます。
もしMicrosoft Access データベース エンジン 2016 再頒布可能コンポーネントがないようなら、ダウンロードしてインストールしておきます。
Acessデータベース拡張子が2007から.mdbから.accdbに変わっているそうなので、それも修正します。
'既存のファイルをオープンする場合
'cnnMdb.Open "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & ThisWorkbook.Path & "¥" & databaes.mdb & ";"
cnnMdb.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & ThisWorkbook.Path & "¥" & database.accdb & ";"
'空のAccessデータベースを作成する場合
Dim cat As New ADOX.Catalog
cat.Create "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & ThisWorkbook.Path & "¥" & database.accdb & ";"
選択や削除等はいままで通りの記述で使えるはずです。
Dim strSql As String
Dim cnnMdb As New ADODB.Connection
Dim recMdb As New ADODB.Recordset
'DBオープン
cnnMdb.Open "Provider=Microsoft.ACE.OLEDB.16.0;Data Source=" & ThisWorkbook.Path & "¥" & database.accdb & ";"
'選択
strSql = "SELECT * FROM TABLE_NAME"
recMdb.Open strSql, cnnMdb, adOpenStatic, adLockOptimistic
Do Until recMdb.EOF
debug.print recMdb("COL_NAME");
recMdb.MoveNext
loop
recMdb.Close
Set recMdb = Nothing
cnnMdb.Close
Set cnnMdb = Nothing
'削除
strSql = "DELETE FROM TABLE_NAME"
cnnMdb.Execute strSql