C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた

C#のDataAdapterを使って、ODBC経由でAccessのaccdbファイルのデータを読み書きしてみました。

目次

  1. 試した環境
  2. 準備
  3. 処理の流れ
  4. 読み込みの流れ
  5. 書き出しの流れ
  6. 試してみた
    1. XAML
    2. コード
  7. 動かしてみた

試した環境

  • 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にします。

  1. OdbcConnectionクラス で、接続のインスタンスを作ります。

  2. 接続インスタンスをOpen()します。

  3. OdbcDataAdapterクラス で、DataAdapterのインスタンスを作ります。

  4. 作ったDataAdapterのFillメソッドを使って、データをDataTableに読み込みます。

  5. 接続インスタンスをClose()します。

書き出しの流れ

DataTableの変更点(追加、削除、変更)をデータベースに反映します。

  1. OdbcConnectionクラスで、接続のインスタンスを作ります。

  2. 接続インスタンスをOpen()します。

  3. OdbcDataAdapterクラスで、DataAdapterのインスタンスを作ります。

  4. OdbcCommandBuilderクラス で、OdbcCommandbuilderのインスタンスを作ります。

  5. GetUpdateCommandメソッドを使って、UPDATEコマンドを作ります。

  6. DataAdapterインスタンスのUpdateメソッドを使って、DataTableの変更点をデータベースに書き込みます。

  7. 接続インスタンスを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」が追加されています。

テーブル

公開日

広告