C# で OleDbDataReader を使って MS Access から値を取得する
MS Access のテーブルから値を取得する
今回は C# で MS Access ファイル (.accdb) のテーブルから、OleDbDataReader を使って値を取得してみましょう。
次のような二つの Test1.accdb と Test2.accdb という名前の MS Access ファイルがあります。
どちらも Students という名前のテーブルに以下のようなデータがはいっています。
Test1.accdb
Test2.accdb
Test2.accdb のほうはパスワードで制限がかけられています。
これらの MS Access ファイルの Students テーブルから値を取得してみましょう。
MS Access への接続文字列
まず、MS Access への接続文字列は次のようになります。
- Data Source=[MS Access ファイルへのパス]
- Jet OLEDB:Database Password=[データベースのパスワード]
パスワードでデータベースへのアクセスが制限されていない場合
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Test\\C#\\MSAccess\\Test1.accdb"
パスワードでデータベースへのアクセスが制限されている場合
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Test\\C#\\MSAccess\\Test2.accdb;Jet OLEDB:Database Password=MyPassword"
これを 「 データベースの接続文字列を App.config から取得する 」 の方法で App.config に置いて、接続文字列を使う準備をしておきます。
<connectionStrings>
<add name="DB1"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Test\\C#\\MSAccess\\Test1.accdb" />
<add name="DB2"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\Test\\C#\\MSAccess\\Test2.accdb;Jet OLEDB:Database Password=MyPassword" />
</connectionStrings>
</pre>
OleDbDataReader を使って MS Access から値を取得する
OleDbDataReader を使ってデータベースから取得したデータを読んで、コンソールに書き出してみましょう。
MS Access データベースの Students テーブルから、StudentID, FirstName, LastName を取得するコードは以下の通りです。
string connString = ConfigurationManager.ConnectionStrings["DB2"].ConnectionString;
string queryString = "SELECT StudentID, FirstName, LastName FROM Students;";
using (OleDbConnection conn = new OleDbConnection(connString))
{
var comm = new OleDbCommand(queryString, conn);
conn.Open();
using (OleDbDataReader dr = comm.ExecuteReader())
{
while (dr.Read())
{
Console.WriteLine(string.Format("{0}: {1} {2}",
dr["StudentID"],
dr["FirstName"],
dr["LastName"]));
}
}
}
OleDbDataReader を使うには System.Data.OleDb、config ファイルから値を取得するのに System.Configuration が必要ですので、using ディレクティブで追加しておきます。
このコードで行っている処理の流れは次の通りです。
- 接続文字列をコンストラクターに渡して OleDbConnection を生成する。
- アドホック・クエリとコネクションをコンストラクターに渡して OleDbCommand を生成する。
- コネクションを open する。
- OleDbCommand の ExecuteReader メソッドを呼んで、OleDbDataReader を生成する。
- OleDbDataReader の Read メソッド を While ループで実行することで、1 行ずつ読み込む。
- 読んだ行をコンソールにフォーマットして書き出す。
OleDbConnection や OleDbDataReader は using ステートメントを使っておかないと、Exception でコードパスが飛んだ時に、Close し忘れる可能性がでてきてしまいますので、using を使います。
OleDbDataReader の Read メソッドはまだ行がある時は true、もうない時は false を返してくれるので、While(dr.Read()) としておけば 全行読み終わった時点で while ループを抜けてくれます。
SqlDataReader の時とほとんど一緒ですね!
こちらが上のコードの ConnectionStrings を DB1、DB2、と変更して実行した結果です。
Test1.accdb
Test2.accdb