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

なぜかはわからないのですが、Windows10のCreatorsUpdateの失敗でWindows10を再インストールさせられた環境で、 この記事 と同じように 「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」 をインストールしてもODBCドライバが見つからないと言われてaccdbファイルにアクセスできないという状態に陥りました。Office2016用の再頒布可能コンポーネントをインストールしても、無理矢理64bit版をインストールしてもだめでした。

というわけで、ODBC接続をあきらめてOleDb接続を試してみました。

目次

  1. 環境
  2. 試してみた
    1. ビュー
    2. コード
    3. 動かしてみた

環境

  • 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を動かしたのでした。

公開日

広告