ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

.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";