C#(コンソール) : ODBC 経由のデータベースの読込み

コンソールから、Windows UI である『ファイル参照ダイアログ』を使用する為に、System.Windows.Forms を参照して [STAThread] を記述しています



概要

ファイル選択をキャンセルした場合は、最初に設定した MySQL に対してアクセスします。ファイル選択で、.xls か .xlsx か .mdb が .accdb を選択すると、それをデータベースとしてアクセスします。
001.using System;
002.using System.Data.Odbc;
003.using System.Diagnostics;
004.using System.Windows.Forms;
005. 
006.namespace DBAccess
007.{
008.        class Program
009.        {
010.                [STAThread]
011.                static void Main(string[] args)
012.                {
013.                        // データベースアクセスに必要なクラス
014.                        OdbcConnection myCon;
015.                        OdbcCommand myCommand;
016.                        OdbcDataReader myReader;
017. 
018.                        // ODBC 接続文字列作成用のクラス
019.                        OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
020. 
021.                        // *******************************************
022.                        // インストールされているドライバ文字列
023.                        // 初期は MySQL として準備する
024.                        // *******************************************
025.                        builder.Driver = "MySQL ODBC 8.0 Unicode Driver";
026.                        // builder.Driver = "MySQL ODBC 5.3 Unicode Driver";
027. 
028.                        // 接続用のパラメータを追加
029.                        builder.Add("SERVER", "localhost");
030.                        builder.Add("DATABASE", "lightbox");
031.                        builder.Add("UID", "root");
032.                        builder.Add("PWD", "");
033. 
034.                        // 接続文字列の内容を確認
035.                        Console.WriteLine(builder.ConnectionString);
036. 
037.                        // System.Windows.Forms の参照が必要です
038.                        OpenFileDialog ofd = new OpenFileDialog();
039. 
040.                        // *******************************************
041.                        // ファイル選択した場合はその DB を使用する
042.                        // *******************************************
043.                        ofd.Filter = "AccessとExcel|*.mdb;*.accdb;*.xls;*.xlsx|すべてのファイル(*.*)|*.*";
044.                        ofd.FilterIndex = 1;
045.                        ofd.Title = "データベースを選択してください";
046.                        ofd.RestoreDirectory = true;
047.                        // 選択した場合は再設定する
048.                        if (ofd.ShowDialog() == DialogResult.OK)
049.                        {
050.                                // リセット
051.                                builder.Clear();
052.                                // 拡張子文字列の簡易チェックで Excel か Access が判断する
053.                                if (ofd.FileName.ToLower().IndexOf(".xl") != -1 )
054.                                {
055.                                        // インストールされているドライバ文字列
056.                                        builder.Driver = "Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)";
057.                                }
058.                                else
059.                                {
060.                                        builder.Driver = "Microsoft Access Driver (*.mdb, *.accdb)";
061.                                }
062. 
063.                                // 接続用のパラメータを追加
064.                                builder.Add("dbq", ofd.FileName);
065.                        }
066. 
067.                        // *******************************************
068.                        // 新しい OdbcConnection オブジェクトを作成
069.                        // ( using で使用後の自動解放を行う )
070.                        // https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement
071.                        // ※ 接続を持続したい場合は using は使わない
072.                        // *******************************************
073.                        using (myCon = new OdbcConnection())
074.                        {
075. 
076.                                // 接続文字列を設定
077.                                myCon.ConnectionString = builder.ConnectionString;
078. 
079.                                // 接続処理
080.                                try
081.                                {
082.                                        // 接続
083.                                        myCon.Open();
084.                                }
085.                                catch (OdbcException ex)
086.                                {
087.                                        // エラー内容( パスワード等でテストする )
088.                                        Console.WriteLine($"Console : {ex.Message}");
089.                                        Debug.WriteLine($"Debug : {ex.Message}");
090.                                }
091. 
092.                                // 接続に失敗している場合は終了
093.                                if (myCon.State != System.Data.ConnectionState.Open)
094.                                {
095.                                        // 終了前に停止
096.                                        Console.ReadLine();
097.                                        return;
098.                                }
099. 
100.                                // *******************************************
101.                                // 接続が完了したので読み出しの準備
102.                                // ▼ 実行する SQL
103.                                // *******************************************
104.                                string myQuery = "select * from 社員マスタ";
105. 
106.                                using (myCommand = new OdbcCommand())
107.                                {
108.                                        // 実行する為に必要な情報をセット
109.                                        myCommand.CommandText = myQuery;
110.                                        myCommand.Connection = myCon;
111. 
112.                                        // *******************************************
113.                                        // 接続と SQL を使用して列データを取り出す
114.                                        // https://docs.microsoft.com/ja-jp/dotnet/api/system.data.odbc.odbcdatareader
115.                                        // *******************************************
116.                                        using (myReader = myCommand.ExecuteReader())
117.                                        {
118. 
119.                                                Console.WriteLine($"定義されている列の数 : {myReader.FieldCount}");
120. 
121.                                                // *******************************************
122.                                                // 列名の一覧
123.                                                // *******************************************
124.                                                for (int i = 0; i < myReader.FieldCount; i++)
125.                                                {
126.                                                        if (i != 0)
127.                                                        {
128.                                                                Console.Write(",");
129.                                                        }
130.                                                        Console.Write(myReader.GetName(i));
131.                                                }
132.                                                // 改行
133.                                                Console.WriteLine();
134. 
135.                                                // *******************************************
136.                                                // データ型の一覧
137.                                                // *******************************************
138.                                                for (int i = 0; i < myReader.FieldCount; i++)
139.                                                {
140.                                                        if (i != 0)
141.                                                        {
142.                                                                Console.Write(",");
143.                                                        }
144.                                                        Console.Write(myReader.GetDataTypeName(i));
145.                                                }
146.                                                // 二つの改行
147.                                                Console.WriteLine("\n");
148. 
149. 
150.                                                // *******************************************
151.                                                // カンマ区切り( CSV ) で出力
152.                                                // *******************************************
153.                                                while (myReader.Read())
154.                                                {
155.                                                        // 文字列
156.                                                        Console.Write($"{GetValue(myReader, "社員コード")},");
157.                                                        Console.Write($"{GetValue(myReader, "氏名")},");
158.                                                        Console.Write($"{GetValue(myReader, "フリガナ")},");
159.                                                        // 整数
160.                                                        Console.Write($"{GetValue(myReader, "給与")},");
161.                                                        Console.Write($"{GetValue(myReader, "手当")},");
162.                                                        // 日付
163.                                                        Console.Write($"{GetValue(myReader, "作成日").Substring(0, 10)},");
164.                                                        Console.Write($"{GetValue(myReader, "更新日")},");
165.                                                        Console.Write(GetValue(myReader, "生年月日"));
166. 
167.                                                        // 改行
168.                                                        Console.WriteLine();
169. 
170.                                                }
171. 
172.                                                myReader.Close();
173. 
174.                                        }
175. 
176.                                        // OdbcCommand に Close はありません
177.                                }
178. 
179.                                // 接続解除
180.                                myCon.Close();
181.                        }
182. 
183.                        // 終了確認用
184.                        Console.WriteLine("\n処理が終了しました");
185. 
186.                        // 終了前に停止
187.                        Console.ReadLine();
188.                }
189. 
190.                // *******************************************
191.                // データを列名文字列で取り出す関数
192.                // *******************************************
193.                static string GetValue(OdbcDataReader myReader, string strName)
194.                {
195. 
196.                        string ret = "";
197.                        int fld = 0;
198. 
199.                        // 指定された列名より、テーブル内での定義順序番号を取得
200.                        fld = myReader.GetOrdinal(strName);
201.                        // 定義順序番号より、NULL かどうかをチェック
202.                        if (myReader.IsDBNull(fld))
203.                        {
204.                                ret = "";
205.                        }
206.                        else
207.                        {
208.                                // NULL でなければ内容をオブジェクトとして取りだして文字列化する
209.                                ret = myReader.GetValue(fld).ToString();
210.                        }
211. 
212.                        // 列の値を返す
213.                        return ret;
214. 
215.                }
216.        }
217.}

関連する記事

32ビット ODBC ドライバの一覧を取得する