2017/01/29

[PowerShell] Access の接続文字列は mdb 形式と accdb 形式で異なる


PowerShell に限った話でもないのですが、外部から Microsoft Access のデータベースにアクセスする際、「Access 2002-2003 データベース(*.mdb)」と、Access 2007 からの「Access データベース(*.accdb)」で接続文字列が異なります。

MDB形式の場合の接続文字列は、以下のようになります。$path は MDB のパスを格納した変数になります。

"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $path"

これを見ると、Provider として Jet.OLEDB 4.0 を使っているのが分かりますが、使用するには注意事項があります。

それは、Jet.OLEDB 4.0 は 32ビット版は提供されているのですが、64ビット版は提供されていないということです。

これが何を意味するのかというと、64ビットの Windows 環境だとデフォルトで PowerShell も 64ビットで動作し、Jet.OLEDB 4.0 がないよエラーが発生してしまうということです。

そのため、MDB 形式の Access データベースにアクセスするには、32ビット環境でアクセスする必要があります。

この点についての詳しい話は、下記記事を参考にしてください。

そして、ACCDB 形式の Access データベースにアクセスするには、以下の接続文字列を使用します。$path は ACCDB のパスを格納した変数になります。

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = $path"

Provider として ACE.OLEDB.12.0 が指定されています。こちらは、64ビット版のみが提供されています。

なお、拡張子をいちいち気にするのも面倒なので、以下のようにスクリプトを組んで接続文字列を切り替えるのも一法でしょうね。

# 拡張子によって接続文字列を切り替える

# MDB 形式の場合
if (([System.IO.Path]::GetExtension($path)) -eq ".mdb") {
 $connectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $path"

# ACCDB 形式の場合
} elseif(([System.IO.Path]::GetExtension($path)) -eq ".accdb") {
 $connectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = $path"

# 上記以外は例外をスロー
} else {
 throw New-Object System.Exception("Access 拡張子エラー")
}

スポンサーリンク


このエントリーをはてなブックマークに追加




Twitter ではブログにはない、いろんな情報を発信しています。


コメント

コメントを書く



プロフィール

  • 名前:fnya
    経歴:
    SE としての経験は15年以上。様々な言語と環境で業務系システム開発を行い、セキュリティ対策などもしていました。現在は趣味SE。

    Twitter では、ブログでは取り上げない情報も公開しています。


    ブログについて

    このブログは、IT、スマートフォン、タブレット、システム開発などに関するさまざまな話題を取り上げたり、雑感などをつづっています。

    >>ブログ詳細
    >>自作ツール
    >>運営サイト
    >>Windows 10 まとめ

    Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから