【WPF】「Oracle.DataAccess」を利用して取得したデータを DataGrid に表示してみる
おはようございます。
今回は、Oracle.DataAccess を使ってデータを検索、データグリッドに表示してみます。
お決まりですが、プログラムは前回までのものを流用します。
https://www.doraxdora.com/blog/2017/08/19/post-2109/
今までと同様、Entity Framework 、LINQ を利用してやってみようと思ったのですが、
ちょっと調べきれなかったのでひとまず DataTable を利用して
自力でマッピングするといった感じになってしまいました。
EFとLINQについてはそのうち時間がある時に。。
スポンサーリンク
参照の追加
パッケージ・エクスプローラーの「参照」を右クリックし、「参照の追加」を選択します。
参照マネージャー画面が表示されるので、「参照」ボタンをクリックします。
ファイル選択ダイアログが表示されるので、端末にインストールした「Oracle」から
Oracle.DataAccess.dll ファイルを指定します。
デフォルトであれば、下記のディレクトリにあります。
c:\oraclexe\app\oracle\product\11.2.0\server\odp.net\bin\4\
プログラムの修正
宣言の追加
MainWindow.xaml.cs
using System.Data; using Oracle.DataAccess.Client;
接続処理の変更
MainWindow.xaml.cs
//using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite")) using (var conn = new OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;"))
初期表示時の処理を修正
MainWindow.xaml.cs
public MainWindow() { InitializeComponent(); using (var conn = new OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;")) { conn.Open(); // データを取得 OracleCommand cmd = new OracleCommand("SELECT * FROM MSTKIND", conn); OracleDataAdapter da = new OracleDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); // コンボボックスに値を設定 List<Kind> sources = new List<Kind>(); Kind k = new Kind(); k.KindCd = ""; k.KindName = "指定なし"; sources.Add(k); foreach (DataRow row in dt.Rows) { k = new Kind(); k.KindCd = row["KIND_CD"].ToString(); k.KindName = row["KIND_NAME"].ToString(); sources.Add(k); } this.search_kind.ItemsSource = sources; this.search_kind.DisplayMemberPath = "KindName"; conn.Close(); } }
検索処理の修正
MainWindow.xaml.cs
/// <summary> /// 検索処理(非同期) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void SearchProcess(object sender, DoWorkEventArgs e) { // 時間のかかるようにする System.Threading.Thread.Sleep(3000); // 猫データマスタを取得してコンボボックスに設定する using (var conn = new OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;")) { conn.Open(); String searchName = (e.Argument as Object[])[0] as String; String searchKind = (e.Argument as Object[])[1] as String; // データを取得 String sql = "SELECT * FROM TBLCAT"; String where = ""; if (searchName != "") { where = " WHERE NAME LIKE '" + searchName + "%'"; } if (searchKind != "") { if (where != "") { where += " AND"; } else { where = " WHERE"; } where += " KIND_CD = '" + searchKind + "'"; } sql += where; OracleCommand cmd = new OracleCommand(sql, conn); OracleDataAdapter da = new OracleDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); List<CatModel> sources = new List<CatModel>(); foreach (DataRow row in dt.Rows) { CatModel c = new CatModel(); c.IsChecked = false; String no = row["NO"].ToString(); c.No = int.Parse(row["NO"].ToString()); c.Name = row["NAME"].ToString(); c.Sex = row["SEX"].ToString(); c.Age = int.Parse(row["AGE"].ToString()); c.Kind = row["KIND_CD"].ToString(); c.Favorite = row["FAVORITE"].ToString(); sources.Add(c); } e.Result = sources; } }
コンバーターの修正
/// <summary> /// データ変換処理 /// </summary> /// <param name="value"></param> /// <param name="targetType"></param> /// <param name="parameter"></param> /// <param name="culture"></param> /// <returns></returns> public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { using (var conn = new OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;")) { conn.Open(); // データを取得 OracleCommand cmd = new OracleCommand("SELECT * FROM MSTKIND WHERE KIND_CD = '" + value + "'", conn); OracleDataAdapter da = new OracleDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); String ret = ""; if (dt.Rows.Count == 1) { ret = dt.Rows[0]["KIND_NAME"].ToString(); } conn.Close(); return ret; } }
ひとまずこれで検索はできるようになるはずです。
起動してみる
検索ボタンをクリックします。
無事に検索してデータが表示されました。
まとめ
例によって、登録・更新・削除はまた次回ということで。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません