【WPF】「Oracle.DataAccess」を利用して取得したデータを DataGrid に表示してみる

2017年9月2日C#,Oracle,開発

おはようございます。

今回は、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;
            }
        }

 

ひとまずこれで検索はできるようになるはずです。

起動してみる

起動後画面

検索ボタンをクリックします。

検索後画面

無事に検索してデータが表示されました。

まとめ

例によって、登録・更新・削除はまた次回ということで。

ではでは。

スポンサーリンク


関連するコンテンツ

2017年9月2日C#,Oracle,開発Oracle,WPF,プログラミング

Posted by doradora