.NETでAccessをDBとして使う
必要になった理由
バッチでAccessのDBを読み取りSql Serverに更新するような要望が発生したため
Àccess DBを.NETで読み取る
以前のAccess2003(.mdb)の場合、「Microsoft.Jet.OLEDB.4.0」を使うらしいが、Access2010(.accdb)以降は、「Microsoft.ACE.OLEDB.12.0」をプロバイダとして使用するらしい
Microsoft Access Database Engine 2016インストール
以下のリンクからダウンロードした。
Download Microsoft Access Database Engine 2016 Redistributable from Official Microsoft Download Center
32bitバント64bit版があるが、64bitのOSには32bit版はインストール時エラーになった。
トラブル
「Microsoft.ACE.OLEDB.12.0' プロバイダーはローカルのコンピューターに登録されていません。」
とエラーになるばかり、いろいろ調べて見ると、AniCpuやx64ではうまく動かず、実行時探しているバージョンは32bitだそう。
仕方ないので、64bit版は削除し、32bit版をインストールする。
AccessDatabaseEngine.exe /quiet
※64bit版OSでは「/quite」オプションで強制的にインストールが可能
一旦、これで接続は成功した。
ソース
プラットフォームはx86で作業しています。
using System.Data; using System.Data.OleDb; private const string CONNECTION_STRING = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db\myDb.accdb"; private OleDbConnection _conn; public void ExecuteSql() { _conn = new OleDbConnection(CONNECTION_STRING); _conn.Open(); OleDbCommand cmd =_conn.CreateCommand(); cmd.CommandText = "SELECT * FROM MY_TABLE"; DataTable dt; OleDbDataAdapter oda = new OleDbDataAdapter(cmd) oda.Fill(dt) _conn.Close(); }
パスワードがついているAccessの場合
「Jet OLEDB:Database Password」でパスワードを指定する
private const string CONNECTION_STRING = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db\myDb.accdb;Jet OLEDB:Database Password=abc";
読取り専用モードでAccessを開きたい場合
「Mode」を指定してAccessを開く
指定値毎のモード
No | Mode |
---|---|
Mode=1 | Read |
Mode=2 | Share Deny None |
Mode=3 | ReadWrite |
Mode=4 | Share Deny None |
Mode=5 | Share Deny None |
Mode=6 | Share Deny None |
Mode=7 | Share Deny None |
Mode=8 | Share Deny Write |
Mode=9 | Share Deny None |
Mode=10 | Share Deny None |
Mode=11 | Share Deny None |
Mode=12 | Share Deny Read|Share Deny Write |
Mode=13 | Read|Share Deny Read|Share Deny Write |
Mode=14 | Share Deny None |
Mode=15 | Share Deny None |
Mode=16 | Share Deny None |
Mode=17 | Share Deny None |
Mode=18 | Share Deny None |
Mode=19 | ReadWrite|Share Deny None |
private const string CONNECTION_STRING = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\db\myDb.accdb;Mode=1";