最初に .accdb か .mdb を選択しておいて、自由な SQL をタイプしてその結果をそのまま Excel のごとく DataGridView に表示します。 DataGridView に表示するデータは全て文字列扱いとして、ArrayList に随時行を追加して、Rows.Add に、ToArray() したものをセットします。 一応表示のみを想定しているので、以下の設定を最初にします 表示件数は多すぎると時間がかかりすきるので、固定で 100 件にしています。
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WinApp1 { public partial class Form1 : Form { private OpenFileDialog ofd = new OpenFileDialog(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { using (OleDbConnection myCon = new OleDbConnection()) using (OleDbCommand myCommand = new OleDbCommand()) { // ********************* // 接続文字列の作成 // ********************* myCon.ConnectionString = string.Format($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={ofd.FileName};"); Debug.WriteLine(myCon.ConnectionString); // ********************* // 接続 // ********************* try { // 接続文字列を使用して接続 myCon.Open(); // コマンドオブジェクトに接続をセット myCommand.Connection = myCon; // コマンドを通常 SQL用に変更 myCommand.CommandType = System.Data.CommandType.Text; } catch (Exception ex) { MessageBox.Show(this,ex.Message); return; } // ********************* // 実行 SQL // ********************* myCommand.CommandText = textBox1.Text; // ********************* // レコードセット取得 // ********************* try { using (OleDbDataReader myReader = myCommand.ExecuteReader()) { // ********************* // 列数 // ********************* int nCols = myReader.FieldCount; // DataGridView 初期化 dataGridView1.Columns.Clear(); dataGridView1.DataSource = null; dataGridView1.ColumnCount = nCols; // カラム数 Type fldType; ArrayList rowData = new ArrayList(); // データ取得と表示 int maxCount = 0; while (myReader.Read()) { // 行データをセットする ArrayList をクリア rowData.Clear(); maxCount++; if ( maxCount > 100 ) { break; } // 初回のみ、タイトル文字列を設定 if (maxCount == 1) { for (int idx = 0; idx < nCols; idx++) { dataGridView1.Columns[idx].Name = myReader.GetName(idx); } } // 行データの作成( ArrayList で作成して ToArray() したものを Rows.Add ) for (int idx = 0; idx <nCols; idx++) { // NULL でない場合 if (!myReader.IsDBNull(idx)) { // 列のデータ型を取得 fldType = myReader.GetFieldType(idx); // 文字列 if (fldType.Name == "String") { rowData.Add(myReader.GetValue(idx).ToString()); } else if (fldType.Name == "Int32") { rowData.Add(myReader.GetInt32(idx).ToString()); } else if (fldType.Name == "DateTime") { rowData.Add(myReader.GetDateTime(idx).ToString()); } else { rowData.Add(myReader.GetValue(idx).ToString()); } } else { rowData.Add(""); } } // 行追加 dataGridView1.Rows.Add(rowData.ToArray()); } // リーダを使い終わったので閉じる myReader.Close(); } } catch (Exception ex) { myCon.Close(); MessageBox.Show(this, ex.Message); return; } myCon.Close(); // カラム幅の自動調整 dataGridView1.AutoResizeColumns(); } // 最外の using の終わり } private void button2_Click(object sender, EventArgs e) { // ********************* // ファイル選択 // ********************* ofd.Filter = "Excel(*.mdb;*.accdb)|*.mdb;*.accdb|すべてのファイル(*.*)|*.*"; ofd.FilterIndex = 1; ofd.Title = "Access データベースを選択してください"; ofd.RestoreDirectory = true; if (ofd.ShowDialog() != DialogResult.OK) { return; } } // click イベントの終わり } // class の終わり }
※ テーブル・ビュー一覧は以下のようにして簡単に表示できます
using (OleDbConnection myCon = new OleDbConnection()) using (OleDbCommand myCommand = new OleDbCommand()) { // ********************* // 接続文字列の作成 // ********************* myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", ofd.FileName); Debug.WriteLine(myCon.ConnectionString); // ********************* // 接続 // ********************* try { // 接続文字列を使用して接続 myCon.Open(); // コマンドオブジェクトに接続をセット myCommand.Connection = myCon; // コマンドを通常 SQL用に変更 myCommand.CommandType = System.Data.CommandType.Text; } catch (Exception ex) { MessageBox.Show(this,ex.Message); return; } DataTable dataTable = myCon.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, new object[] { null, null, null, null } ); // TABLE のみの場合は以下( 上記は 全て ) // new object[] { null, null, null, "TABLE" } dataGridView1.Columns.Clear(); dataGridView1.DataSource = dataTable; myCon.Close(); // カラム幅の自動調整 dataGridView1.AutoResizeColumns(); } // 最外の using の終わり
さらに SQL の実行結果は、データの途中加工が全くできなくなりますが、DataTable を使って以下のようにさらに短く記述する事ができます
// ********************* // 実行 SQL // ********************* myCommand.CommandText = textBox1.Text; try { using (OleDbDataReader myReader = myCommand.ExecuteReader()) { DataTable dataTable = new DataTable(); dataTable.Load(myReader); dataGridView1.Columns.Clear(); dataGridView1.DataSource = dataTable; myReader.Close(); } } catch (Exception ex) { myCon.Close(); MessageBox.Show(this, ex.Message); return; }
DataSource プロパティを使用した場合、新たに直接データをセットしていきたい場合は、いったん DataSource プロパティに null を設定しておく必要があります。 Microsoft.ACE.OLEDB.12.0 がインストールされていない場合 Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。 ( 32ビット版と64ビット版があるので選択してダウンロードします )
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート
- C# でDXライブラリを使って簡単なシューティングをクラス化して標準化 / メインループとプレイヤー (4)