C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた
C#のDataAdapterを使って、ODBC経由でAccessのaccdbファイルのデータを読み書きしてみました。
目次
試した環境
Visual Studio 2015 Express for Windows Desktop (C#)
Windows 10 (64bit)
Access 2016 (Office365 solo)
準備
Office365 SoloのAccess 2016をインストールしても、C#で作成したアプリからアクセスするためのODBCドライバーがインストールされませんので、 Microsoftのサイト から「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」をダウンロードしてインストールします。
使用条件に注意してください。
処理の流れ
ADO.NET を使って非同期のデータアクセスをします。具体的に言うと、データベースから必要なデータを取り出してメモリに保持し、メモリ上でデータを操作して、メモリからデータベースに書き出します。読み込んでから書き出すまでの間に他の人にデータを更新されても問題無いケースで使うパターンですね。
読み込みの流れ
データの読み込み先はDataTableにします。
OdbcConnectionクラス で、接続のインスタンスを作ります。
接続インスタンスをOpen()します。
OdbcDataAdapterクラス で、DataAdapterのインスタンスを作ります。
作ったDataAdapterのFillメソッドを使って、データをDataTableに読み込みます。
接続インスタンスをClose()します。
書き出しの流れ
DataTableの変更点(追加、削除、変更)をデータベースに反映します。
OdbcConnectionクラスで、接続のインスタンスを作ります。
接続インスタンスをOpen()します。
OdbcDataAdapterクラスで、DataAdapterのインスタンスを作ります。
OdbcCommandBuilderクラス で、OdbcCommandbuilderのインスタンスを作ります。
GetUpdateCommandメソッドを使って、UPDATEコマンドを作ります。
DataAdapterインスタンスのUpdateメソッドを使って、DataTableの変更点をデータベースに書き込みます。
接続インスタンスをClose()します。
試してみた
下図のデータのitem_tableというテーブルのデータを読み込んで、「OneNote」というアイテムを追加してみます。IDはオートインクリメントです。
XAML
<Window x:Class="WpfApplication1.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:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<DataGrid Name="datagrid" ItemsSource="{Binding}" />
</Grid>
</Window>
ウィンドウにDataGridを付けただけです。DataGridとDataTableをバインディングします。
コード
using System;
using System.Windows;
using System.Data;
using System.Data.Odbc;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string connectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=./trial.accdb; Uid =admin; Pwd =; ";
string queryString = "SELECT * FROM item_table";
DataTable dt = new DataTable();
// 読み込み
try
{
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
OdbcDataAdapter adapter = new OdbcDataAdapter(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 (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
OdbcDataAdapter adapter = new OdbcDataAdapter(queryString, connection);
OdbcCommandBuilder builder = new OdbcCommandBuilder(adapter);
adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.Update(dt);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
ものすごくすっきりしてますよね。ファイルへの入出力がこれで済むっていうのは、とっても楽です。
usingステートメント を使うことで、OdbcConnectionのclose忘れを予防してます。
動かしてみた
実行すると、下図の様に「OneNote」が追加されます。
表示しているのはDataTableなので、IDには何も入っていません。
データをAccessで表示してみると、下図の様にテーブルに「OneNote」が追加されています。
公開日
広告
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#のスタックを試してみた