BETA

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

投稿日:2019-07-02
最終更新:2019-07-02
※この記事は外部サイト(https://www.doraxdora.com/blog/2017/09/02/...)からのクロス投稿です

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

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

起動してみる

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

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

まとめ

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

ではでは。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!