プログラミングのメモ

プログラミングの学び直し備忘録

C#:Access

DB作成

「クラスが登録されていません」エラー
インストールした「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」と
ビルド - 対象プラットフォーム を合わせる

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Diagnostics;


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Microsoft ActiveX Data Objects 6.1 Library
// Microsoft ADO Ext.6.0 for DLL and Security
using ADOX;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++
using System.Data;  //DataSet
using System.Data.OleDb; //OleDbConnection
using System.Data.SqlClient; //SqlConnection,SqlCommand
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++

namespace ADO.Access_Db
{
    public partial class Access_Db_frm : Form
    {

        string _sProvider = @"Microsoft.ACE.OLEDB.12.0";
        string _sDataSorce = @"D:" + @"\test3.accdb";
        string _sPass = @"pass";


        //###############################################
        /// <summary>
        /// コンストラクタ
        /// </summary>
        //###############################################
        public Access_Db_frm()
        {
            InitializeComponent();
        }

        //##################################################################
        /// <summary>
        /// [0001] DB作成
        ///         /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //##################################################################
        private void cmd_DreateDB_Click(object sender, EventArgs e)
        {
            try
            {

                if (!System.IO.File.Exists(_sDataSorce))
                {

                    ADOX.Catalog cat = new ADOX.Catalog();

                    ADODB.Connection AccDb = cat.Create(
                                                        "Provider = " + _sProvider +"; "
                                                        + " Data Source=" + _sDataSorce + ";"
                                                        + "Jet OLEDB:Engine Type=6"
                                                        );

                    AccDb.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //##################################################################
        /// <summary>
        /// [0002] DB削除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //##################################################################
        private void cmd_DeleteDB_Click(object sender, EventArgs e)
        {
            if (System.IO.File.Exists(_sDataSorce))
            {
                System.IO.File.Delete(_sDataSorce);
            }
        }

        //##################################################################
        /// <summary>
        /// [0101] TB1 作成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //##################################################################
        private void cmd_CreateTable_Click(object sender, EventArgs e)
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // TB 作成
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */

            string sTBname = "TB_01";
            var dicFlds = new Dictionary<string, string>();
            dicFlds.Add("File", "TEXT");
            dicFlds.Add("Sheet1", "TEXT");
            dicFlds.Add("Code", "TEXT");
            dicFlds.Add("Data01", "TEXT");
            dicFlds.Add("Data02", "TEXT");


            //////======================================================
            ////for (int i = 0; i < 5; i++)
            ////{
            ////    dicFlds.Add("Key0" + i, "TEXT");
            ////}

            List<string> lstFlds = new List<string>();
            foreach (var item in dicFlds)
            {
                lstFlds.Add(item.Key + " " + item.Value);
            }
            //////======================================================

            string sSQL = "";
            //sSQL += "CREATE TABLE テスト(コード INT, 商品名 TEXT)";
            sSQL += "CREATE TABLE "+ sTBname +  "(" + string.Join(",", lstFlds) + ")";

            try
            {
                // Connection + SQL
                OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Create TB", "通知");

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }

        }

        //##################################################################
        /// <summary>
        /// [] テーブルリスト
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //##################################################################
        private void cmd_GetTableList_Click(object sender, EventArgs e)
        {
            DataTable dt = mth_GetTableList();

        }

        //========================================================
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        //========================================================
        private DataTable mth_GetTableList()
        {

            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());

            cn.Open();

            //---------------------------------------------------------------
            // TBリスト ⇒ 「OleDbSchemaGuid.Tables」
            // - OleDbSchemaGuid クラス
            // - Tables フィールド
            //---------------------------------------------------------------
            /*
             * 「OleDbSchemaGuid」は、結果を「DataTable」で返す。
             * 「DataTable」は、1テーブルの情報を1レコードとしてテーブルごとの情報が格納されている
             *  このうち、テーブル名は3番目の[TABLE_NAME]フィールドに格納されている
             *  https://docs.microsoft.com/ja-jp/dotnet/api/system.data.oledb.oledbschemaguid.tables?view=dotnet-plat-ext-3.1
             *  
             */
            //DataTable dt = new DataTable();
            DataTable dt = cn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,
                                            new object[] { null, null, null, "TABLE" }
                                            );

            cn.Close();

            foreach (DataRow dr in dt.Rows)
            {
                //Console.WriteLine(string.Join(",", dr.ItemArray));
                //Console.WriteLine(dr[2]);
                Console.WriteLine(dr["TABLE_NAME"]);
            }

            return dt;

        }

    }
}