|||||||||||||||||||||

なんぶ電子

- 更新: 

ODBCドライバをMySQLからMariaDBに差替

ODBCデータソース

昔データベースをMySQLからMariaDBに差し替えたのですが、エクセルのVBAで使っていたODBCドライバがMySQLのままだった事にいまさらながらに気づきました。

なんの問題もなく使えているのですが、MariaDBが徐々に独自路線で歩みを進めているようにも感じらる今日この頃、いいきっかけなのでODBCドライバを差し替えることにしました。

MariaDBのODBCドライバのダウンロード

MariaDBのウェブページは、mariadb.orgとmariadb.comのふたつが存在するようです。前者はFoundation(財団)で公社はCorporation(会社)のものだと思われます。

Windows用のODBCドライバのバイナリは、mariadb.com側にのみ存在しましたのでそちらからダウンロードしてインストールします。OSやアーキテクチャ(32/64)は環境にあったものを選択してください。

MariaDB ODBCドライバ

今回筆者はMS Office2019のVBA用に利用したかったのですが、ダウンロードするODBCドライバのバージョンは32bit版を使うことになりました。OSは64bitなのですが、Officeは32bit版なのがその理由です。

ちなみにOffice2019でアプリのアーキテクチャを確認するには、「ファイル」→「その他」→「アカウント」→「Word/Excelのバージョン情報」と進めると出てきます。

エクセル2019のアーキテクチャ確認方法

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

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告