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; } } }