2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#でAccessファイル(.accdb)を操作する

Last updated at Posted at 2023-04-24

OLEDBで.accdbへ接続します。

0.using

using System.Data.OleDb;  //宣言を短くする為追加しておく

1.テーブル名カラム名取得

        OleDbConnectionStringBuilder builder;

        private void Form_Load(object sender, EventArgs e)
        {
            builder = new OleDbConnectionStringBuilder();
            builder["Provider"] = "Microsoft.ACE.OLEDB.12.0";
            builder["Data Source"] = "C:\\・・・\\データベース名.accdb";
            //builder["Jet OLEDB:Database Password"] = "abcde";
        }
        
        private void buttonテーブル名カラム名取得_Click(object sender, EventArgs e)
        {
            Console.WriteLine("----------テーブル名-----------");
            using (var cn = new System.Data.OleDb.OleDbConnection(builder.ConnectionString))
            {
                cn.Open();
                var dt = cn.GetSchema("Tables");
                foreach (DataRow row in dt.Rows)
                {
                    var tableName = row["TABLE_NAME"].ToString();
                    Console.WriteLine(tableName);
                }
                cn.Close();
            }

            Console.WriteLine("----------テーブル名+カラム名-----------");
            using (var cn = new OleDbConnection(builder.ConnectionString))
            {
                cn.Open();
                var dt = cn.GetSchema("Columns");
                foreach (DataRow row in dt.Rows)
                {
                    var tableName = row["TABLE_NAME"].ToString();
                    var fieldName = row["COLUMN_NAME"].ToString();
                    var text = string.Format("{0}.{1}", tableName, fieldName);
                    Console.WriteLine(text);
                }
                cn.Close();
            }
        }
        

2.テーブル作成/削除

        private void buttonCreateTable_Click(object sender, EventArgs e)
        {
            Console.WriteLine("----------テーブル作成-----------");
            using (var cn = new OleDbConnection(builder.ConnectionString))
            {
                //テーブル作成の場合
                string  sql ="";
                    sql += "CREATE TABLE テスト([社員番号] TEXT, [氏名] TEXT, [部門] TEXT";
                    sql += " ,CONSTRAINT [PrimaryKey] PRIMARY KEY ([社員番号]) )";

                //テーブル作削除の場合
                string sql = "DROP TABLE テスト";

                try
                {
                   cn.Open();
                    // Connection + SQL
                    var cmd = new OleDbCommand(sql, cn);
                    // ExecuteNonQuery
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("テーブルを作成/削除しました。", "通知");
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
                }
                finally
                {
                    cn.Close();
                }
            }
        }
  

3.Insert文

        private void buttonInsert_Click(object sender, EventArgs e)
        {
            Console.WriteLine("----------Insert文-----------");
            using (var cn = new OleDbConnection(builder.ConnectionString))
            {
                string 
                    sql  = "INSERT INTO テスト ([社員番号], [氏名], [部門])";
                    sql += " VALUES('123456', '大山 雪男', '企画');";

                    //sql += "insert into テスト ([社員番号], [氏名], [部門])";
                    //sql += " values('112233', '海原 鯨子', '販売');";
                    //連続不可。CSVファイルにして…もあるようだが面倒。

                try
                {
                    cn.Open();
                    // Connection + SQL
                    var cmd = new System.Data.OleDb.OleDbCommand(sql, cn);  
                    // ExecuteNonQuery
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("insertしました。", "通知");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "通知");
                }
                finally
                {
                    cn.Close();
                }
            }
        }
   

4.トランザクション付きデータ処理

SQLをListにして渡しちゃえ!

        private string トランザクション付きデータ処理(List<string> sql)
        {
            Console.WriteLine("----------トランザクション付きデータ処理-----------");

            using (OleDbCommand cmd = new OleDbCommand())
            {
                OleDbConnection cn = new OleDbConnection();
                cn.ConnectionString = builder.ConnectionString;

                // トランザクションを開始します。
                cn.Open();
                OleDbTransaction transaction = cn.BeginTransaction(IsolationLevel.ReadCommitted);

                try
                {
                    cmd.Connection = cn;
                    cmd.Transaction = transaction;

                    foreach (var s in sql)
                    {
                        cmd.CommandText = s;
                        cmd.ExecuteNonQuery();
                    }

                    //トランザクションをコミットします。
                    transaction.Commit();
                    MessageBox.Show("正常完了しました。", "通知");
                    return "OK";
                }
                catch (Exception ex)
                {
                    //トランザクションをロールバックします。
                    transaction.Rollback();
                    MessageBox.Show(ex.Message, "通知");
                    return "NG";
                }
                finally
                {
                    cn.Close();
                }
        }

5.Select文

        private void buttonSelect_Click(object sender, EventArgs e)
        {
            Console.WriteLine("----------Select文-----------");
            using (var cn = new OleDbConnection(builder.ConnectionString))
            {
                string sql = "SELECT * FROM テスト";

                OleDbCommand command = new OleDbCommand(sql, cn);
                cn.Open();
                OleDbDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    //Console.WriteLine(reader[0].ToString());
                    Console.WriteLine("結果⇒ {0} / {1} / {2}", reader["社員番号"].ToString(), reader["氏名"].ToString(), reader["部門"].ToString());
                }
                reader.Close();
            }
        }
        

6.一発でDataGridViewに表示する。

            using (var cn = new OleDbConnection(Access接続文字列))
            {
                // Accessのデータベースファイルに接続する
                cn.Open();

                string sql = "SELECT * FROM ・・・";

                // OleDbCommandインスタンスを生成する
                using (OleDbCommand command = new OleDbCommand(sql, cn))
                {
                    // OleDbDataAdapterインスタンスを生成する
                    using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                    {
                        // DataTableインスタンスを生成する
                        DataTable dt = new DataTable();
                        // データテーブルにデータを格納する
                        adapter.Fill(dt);
                        // DataGridViewにデータを表示する
                        dataGridView1.DataSource = dt;
                    }
                }
            }

7.accdbファイルを最適化する

とても時間が掛かったのでメモ残します。

1)参照の追加
  [プロジェクト]→[参照の追加]で、
  Microsoft.Office.Interop.Access.Daoを追加します。
DAO参照.png

2)コード

using Microsoft.Office.Interop.Access.Dao; //最適化用
using System.IO;                           //ファイル操作用

        private void button最適化_Click_1(object sender, EventArgs e)
        {
            //DBEngine dbe = new DBEngineClass();  //←これだと相互運用型云々のエラー出る。
            DBEngine dbe = new DBEngine();

            string before = @"~パス~\DB.accdb";         //オリジナルのアクセスファイル
            string after  = @"~パス~\DBd_done.accdb";   //最適化後のアクセスファイル

            if (File.Exists(after)) // 前のファイルが残っていたら削除(念の為)
            {
                File.Delete(after);
            }

            dbe.CompactDatabase(before, after, null, null, null);

            File.Delete(before);
            File.Move(after, before);
        }

こうするとこんなエラーになります。
相互運用型エラー.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?