コンソールから、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 ドライバの一覧を取得する