C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた(OleDb編)
なぜかはわからないのですが、Windows10のCreatorsUpdateの失敗でWindows10を再インストールさせられた環境で、 この記事 と同じように 「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」 をインストールしてもODBCドライバが見つからないと言われてaccdbファイルにアクセスできないという状態に陥りました。Office2016用の再頒布可能コンポーネントをインストールしても、無理矢理64bit版をインストールしてもだめでした。
というわけで、ODBC接続をあきらめてOleDb接続を試してみました。
目次
環境
Windows10 Home 64bit バージョン1709
Office365 solo 32bit
Microsoft Access データベース エンジン 再頒布可能コンポーネント 32bit
Visual Studio Express 2015 for Windows Desktop (プロジェクトはAny CPUでビルド)
試してみた
ビュー
この記事 と同じです。
<Window x:Class="db_trial.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:db_trial"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<DataGrid Name="datagrid" ItemsSource="{Binding}" />
</Grid>
</Window>
データベースへの接続を変えるだけなので、XAMLは変わりません。
コード
using System;
using System.Windows;
using System.Data;
using System.Data.OleDb;
namespace db_trial
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=./test.accdb";
string queryString = "SELECT * FROM item_table";
DataTable dt = new DataTable();
// 読み込み
try
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, connection);
adapter.Fill(dt);
datagrid.DataContext = dt; // DataGridへの表示
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
// データを追加
DataRow nr = dt.NewRow();
nr["item"] = "OneNote";
dt.Rows.Add(nr);
// 読み込み
try
{
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, connection);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.Update(dt);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
using句のodbcがoledbに変わりました。
OdbcConnectionやOdbcDataAdapterなどの、データベースを扱うクラスの指定(接頭辞)がOdbcからOleDbに変わりました。
ConnectionStringが、”Provider=Microsoft.ACE.OLEDB.12.0; Data Source=ファイル” というふうになります。
MSDNのConnectionStringのサンプル ではMicrosoft.Jet.OLEDB.4.0となっていますが、Access2010あたりからACEに切り替わったはずです。Access2016のデータはACEでないと読めないはず。
動かしてみた
もとのデータがこれです。
実行すると、読み込めました。
でも、DataTableにFillして、LINQであれこれして、Updateで書き込むだけなら、Accessはただのデータストアなんですよね。データベースを交換するわけでも共有するわけでもなくて、データの件数もそれほど多くないのであれば、別にcsvでも良いのでは?
というわけで、久しぶりにAccessを動かしたのでした。
公開日
広告
C#でデータ処理カテゴリの投稿
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた(OleDb編)
- C#でDataGridに表示するデータを操作してみた
- C#でDataTableのカラムのデータ型を読んでみた
- C#でDataTableの自動インクリメントをしてみた
- C#でJSON形式のデータを出力してみた
- C#でLinq to objectの結果をDataTableにしてみた
- C#でSQLite3のデータベースを使ってみる(ADO.NET ファクトリーデザインパターン)
- C#でSQLiteを使ってみる(インストール)
- C#でコレクションの要素の数を調べる
- C#でコレクションを内部結合してみた
- C#でコレクションを左外部結合してみた
- C#でコレクションを昇順または降順に並び替える
- C#で渡された配列を加工して配列で返す関数について注意すること
- C#のキューを試してみた
- C#のスタックを試してみた