2019-07-02に投稿

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

今回は、Oracle.DataAccess を使ってデータを検索、データグリッドに表示してみます。
プログラムは前回までのものを流用します。
【WPF】別ウィンドウに値を受け渡して、データを更新できるようにしてみた

今までと同様、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;
            }
        }

 

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

起動してみる

起動後の画面

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

検索後の画面

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

まとめ

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

ではでは。

Originally published at www.doraxdora.com

doraxdora

IT関係の仕事をしています/1985年生まれの東京在住/便利なサービスやツール漁りや料理などが好き/2017年~ブログやってます/自分でサービスとか作ってリリースしたい/何かありましたらお気軽にDMどうぞ

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント