C#から、Accessのがインストールされていない環境で、MDBファイルを使用する方法のメモ。
まずは、参照設定でMicrosoft ADO Ext X.X for DDL and Securityを追加します。
1.MDBファイルを作成する
1 2 3 4 |
private string DBSource = "Provider=Microsoft.Jet.OLEDB.4.0;" + //プロバイダ (32bitのみ) "Data Source=D:\\TestFile.mdb;" + //ファイル名の指定 "Jet OLEDB:Engine Type=5"; //Engine Type は 5 |
※接続文字列は、以降の内容でも共通です。
64Bit環境で使用する場合、”Provider=Microsoft.ACE.OLEDB.12.0;”に変更する必要がある。
ただし、Accessがインストールされていない場合は、
Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント
などの、追加モジュールが必要になるとの事。
1 2 3 4 5 6 |
//Accessデータベースファイルの作成 private void AccessMdbCreate(){ ADOX.Catalog cat = new ADOX.Catalog(); cat.Create(DBSource); cat = null; } |
ファイルが存在する場合などは、例外が発生するのでTryにて対応しよう。
2.テーブルを作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
//Tableの作成 private void AccessMdbAddTable(){ try{ //MDBファイルに接続する ADOX.Catalog cat = new ADOX.Catalog(); cat.let_ActiveConnection(DBSource); //テーブルの作成 ADOX.Table table = new ADOX.Table(); table.ParentCatalog = cat; table.Name = "TABLE1"; //テーブル名 //列名1 Id(整数値)の作成 ADOX.Column columnId = new ADOX.Column(); columnId.ParentCatalog = cat; columnId.Type = ADOX.DataTypeEnum.adInteger; //事前に設定しないと"AutoIncrement"でエラーとなる columnId.Name = "Id"; //列名 columnId.Properties["Jet OLEDB:Allow Zero Length"].Value = false; //空白を許可しない columnId.Properties["AutoIncrement"].Value = true; //自動採番とする table.Columns.Append(columnId, ADOX.DataTypeEnum.adInteger); //形を指定して追加 //列名2 ADOX.Column columnName = new ADOX.Column(); columnName.ParentCatalog = cat; columnName.Name = "Name"; //列名 columnName.Properties["Jet OLEDB:Allow Zero Length"].Value = true; //空白を許可する table.Columns.Append(columnName, ADOX.DataTypeEnum.adWChar, 64); //形を指定して追加 (64文字) //主キーの設定 table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "Id", "", ""); //複数設定する場合 //ADOX.Key key = new ADOX.Key(); //key.Name = "PrimaryKey"; //key.Type = ADOX.KeyTypeEnum.adKeyPrimary; //key.Columns.Append("Id"); //key.Columns.Append("Name"); //table.Keys.Append(key); //テーブルを追加 cat.Tables.Append(table); //接続を閉じる cat.ActiveConnection.Close(); MessageBox.Show("テーブルの作成終了", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); }catch (Exception ex){ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//Tableの作成(簡易版) private void AccessMdbAddTable2(){ try{ //MDBファイルに接続する ADOX.Catalog cat = new ADOX.Catalog(); cat.let_ActiveConnection(DBSource); //テーブルの作成 ADOX.Table table = new ADOX.Table(); table.Name = "TABLE2"; //列の追加 table.Columns.Append("ID", ADOX.DataTypeEnum.adInteger); table.Columns.Append("名前", ADOX.DataTypeEnum.adVarWChar, 50); //主キーの設定 table.Keys.Append("PrimaryKey", ADOX.KeyTypeEnum.adKeyPrimary, "ID", "", ""); //テーブルを追加 cat.Tables.Append(table); //接続を閉じる cat.ActiveConnection.Close(); MessageBox.Show("テーブルの作成終了", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); }catch (Exception ex){ MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
テーブルを作成するには、MDBファイルに接続し、テーブルを作成し、列を追加していく。列を追加する際に、細かなオプションを設定する場合と、とりあえず列を追加してしまう2パターン。既に存在するテーブルを作成すると例外が発生する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//SQL文でテーブルを作成する private void AccessMdbAddTable3(){ //MDBに接続 System.Data.OleDb.OleDbConnection Con = new System.Data.OleDb.OleDbConnection(); Con.ConnectionString = DBSource; Con.Open(); //SQL文を実行 System.Data.OleDb.OleDbCommand command = Con.CreateCommand(); command.CommandText = "CREATE TABLE 会員(ID COUNTER PRIMARY KEY,会員名 CHAR(10),ポイント INT,入会 YESNO,メモ MEMO,登録日 DATE);"; command.CommandTimeout = 30; command.ExecuteNonQuery(); command.Dispose(); //接続を閉じる Con.Close(); } |
もしくは、SQL文でテーブルを作成してまう方法もある。ポイントは、ADOX.Catalogではなく、System.Data.OleDb.OleDbConnectionを使用するのと、SQLと異なり、System.Data.SqlClient.SqlCommandではなく、System.Data.OleDb.OleDbCommand commandを使用する事です。
以降の項目で、説明しますが、SQLコマンドの実行は、SQLサーバに対する方法とほぼ同様です。
3.テーブルにデータを追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//データの追加 private void AccessMdbAppend(string name){ //MDBに接続 System.Data.OleDb.OleDbConnection Con = new System.Data.OleDb.OleDbConnection(); Con.ConnectionString = DBSource; Con.Open(); //SQL文を実行 System.Data.OleDb.OleDbCommand command = Con.CreateCommand(); //実行するSQLクエリーを指定 command.CommandText = "INSERT INTO TABLE1 (Name) VALUES (@Name)"; //結果が返ってくるまで待機する秒数 command.CommandTimeout = 30; //変換パラメーターの設定 //command.Parameters.Add("@Name", System.Data.OleDb.OleDbType.Char).Value = name; //こちらは非推奨ら command.Parameters.AddWithValue("@Name", System.Data.OleDb.OleDbType.Char).Value = name; //指定した SQL コマンドを実行 command.ExecuteNonQuery(); command.Dispose(); //接続を閉じる Con.Close(); } |
微妙に違う部分として、SqlDbTypeから、System.Data.OleDb.OleDbTypeに変更したり、Parameters.Addは非推奨でAddWithValueを使ったりしました。
4.テーブルからデータを取得する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//データの取得 private void AccessMdbSelect(){ //MDBに接続 System.Data.OleDb.OleDbConnection Con = new System.Data.OleDb.OleDbConnection(); Con.ConnectionString = DBSource; Con.Open(); //SQL文を実行 System.Data.OleDb.OleDbCommand command = Con.CreateCommand(); //実行するSQLクエリーを指定 command.CommandText = "SELECT * FROM TABLE1"; //結果が返ってくるまで待機する秒数 command.CommandTimeout = 30; //指定した SQL コマンドを実行して SqlDataReader を構築する System.Data.OleDb.OleDbDataReader reader = command.ExecuteReader(); command.Dispose(); //読み込んだデータを表示 while (reader.Read()){ Console.WriteLine(reader[0].ToString() + "," + reader[1].ToString()); Console.WriteLine(reader["Id"].ToString() + "," + reader["Name"].ToString()); } reader.Close(); //接続を閉じる Con.Close(); } |
こちらは、System.Data.SqlClient.SqlDataReaderから、System.Data.OleDb.OleDbDataReaderに変更しました。
AccessのMDBを使用する場合でも、SQLサーバーを使用する場合とほぼ同等ですが、一部クラス名や列挙体の指定が異なってしまうことが、残念です。簡単なデータなら、どちらのデータベースを使用するか選択できると、良かったのですが。