【WPF】SQLiteに接続してデータを登録してみる

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

前回に引き続き、SQLiteネタです。
やっぱりデータ検索をしたら登録、更新、削除までやらないとですよね。

ということで
プログラムは前回のものを流用します。

【WPF】SQLite から Linq でデータを取得してDataGrid に表示してみる

画面の修正


まず、画面にボタンを追加します。

MainWindow.xaml


<DataGrid Name="dataGrid" HorizontalAlignment="Left" Margin="10,43,0,0" Width="497" Height="225" Style="{StaticResource grid-normal}">  
                <DataGrid.Columns>  
                    <DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/>  
                    <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/>  
                    <DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True" Width="40"/>  
                    <DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True" Width="40"/>  
                    <DataGridTextColumn Binding="{Binding Kind}" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/>  
                    <DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="*"/>  
                </DataGrid.Columns>  
            </DataGrid>  
            <Button x:Name="add_button" Content="追加" HorizontalAlignment="Left" Margin="10,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="add_button_Click"/>  
            <Button x:Name="upd_button" Content="更新" HorizontalAlignment="Left" Margin="90,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="upd_button_Click"/>  
            <Button x:Name="del_button" Content="削除" HorizontalAlignment="Left" Margin="172,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="del_button_Click"/>

データグリッドの高さを調整し、画面の下部にボタンを追加し、
更に追加したボタンにクリックイベントを追加。

検索処理の修正


追加、更新、削除後にデータを再検索するために、
検索処理を検索ボタンクリックイベントの処理から分離します。

MainWindow.xaml.cs

            /// <summary>  
            /// 検索ボタンクリックイベント.  
            ///   
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void search_button_Click(object sender, RoutedEventArgs e)  
            {  
                logger.Info("検索ボタンクリック");  
                searchData();  
            }  

            /// <summary>  
            /// データ検索処理.  
            /// </summary>  
            private void searchData()  
            {  
                using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))  
                {  
                    conn.Open();  

                    // 猫データマスタを取得してコンボボックスに設定する  
                    using (DataContext con = new DataContext(conn))  
                    {  
                        String searchName = this.search_name.Text;  
                        String searchKind = (this.search_kind.SelectedValue as Kind).KindCd;  

                        // データを取得  
                        Table<Cat> tblCat = con.GetTable<Cat>();  

                        // サンプルなので適当に組み立てる  
                        IQueryable<Cat> result;  
                        if (searchKind == "")  
                        {  
                            // 名前は前方一致のため常に条件していしても問題なし  
                            result = from x in tblCat  
                                     where x.Name.StartsWith(searchName)  
                                     orderby x.No  
                                     select x;  
                        }  
                        else  
                        {  
                            result = from x in tblCat  
                                     where x.Name.StartsWith(searchName) &amp; x.Kind == searchKind  
                                     orderby x.No  
                                     select x;  

                        }  
                        this.dataGrid.ItemsSource = result.ToList();  

                    }  

                    conn.Close();  
                }  
            }

データ追加(INSERT)


追加ボタンのクリックイベントに処理を実装します。

MainWindow.xaml.cs

            /// <summary>  
            /// 追加ボタンクリックイベント  
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void add_button_Click(object sender, RoutedEventArgs e)  
            {  
                logger.Info("追加ボタンクリック");  

                // 接続  
                using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))  
                {  
                    conn.Open();  

                    // データを追加する  
                    using (DataContext context = new DataContext(conn))  
                    {  
                        // 対象のテーブルオブジェクトを取得  
                        var table = context.GetTable<Cat>();  
                        // データ作成  
                        Cat cat = new Cat();  
                        cat.No = 5;  
                        cat.Name = "こなつ";  
                        cat.Sex = "♀";  
                        cat.Age = 7;  
                        cat.Kind = "01";  
                        cat.Favorite = "布団";  
                        // データ追加  
                        table.InsertOnSubmit(cat);  
                        // DBの変更を確定  
                        context.SubmitChanges();  
                    }  
                    conn.Close();  
                }  
                // データ再検索  
                searchData();  
                MessageBox.Show("データを追加しました。");  
            }

今回は簡単に試してみたかったので
フォームを用意せずに固定でデータを追加します。

データ更新(UPDATE)


更新ボタンのクリックイベントに処理を実装します。
            /// <summary>  
            /// 更新ボタンクリックイベント  
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void upd_button_Click(object sender, RoutedEventArgs e)  
            {  
                logger.Info("更新ボタンクリック");  

                // 選択チェック  
                if (this.dataGrid.SelectedItem == null)  
                {  
                    MessageBox.Show("更新対象を選択してください。");  
                    return;  
                }  

                // 接続  
                using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))  
                {  
                    conn.Open();  

                    // データを追加する  
                    using (DataContext context = new DataContext(conn))  
                    {  
                        // 対象のテーブルオブジェクトを取得  
                        var table = context.GetTable<Cat>();  
                        // 選択されているデータを取得  
                        Cat cat = this.dataGrid.SelectedItem as Cat;  
                        // テーブルから対象のデータを取得  
                        var target = table.Single(x => x.No == cat.No);  
                        // データ変更  
                        target.Favorite = "高いところ";  
                        // DBの変更を確定  
                        context.SubmitChanges();  
                    }  
                    conn.Close();  
                }  

                // データ再検索  
                searchData();  

                MessageBox.Show("データを更新しました。");  
            }

今回は簡単に・・・(略

データ削除(DELETE)


削除ボタンのクリックイベントに処理を実装します。

MainWindow.xaml.cs

            /// <summary>  
            /// 削除ボタンクリックイベント  
            /// </summary>  
            /// <param name="sender"></param>  
            /// <param name="e"></param>  
            private void del_button_Click(object sender, RoutedEventArgs e)  
            {  
                logger.Info("追加ボタンクリック");  

                // 選択チェック  
                if (this.dataGrid.SelectedItem == null)  
                {  
                    MessageBox.Show("削除対象を選択してください。");  
                    return;  
                }  

                // 接続  
                using (var conn = new SQLiteConnection("Data Source=SampleDb.sqlite"))  
                {  
                    conn.Open();  

                    // データを削除する  
                    using (DataContext context = new DataContext(conn))  
                    {  
                        // 対象のテーブルオブジェクトを取得  
                        var table = context.GetTable<Cat>();  
                        // 選択されているデータを取得  
                        Cat cat = this.dataGrid.SelectedItem as Cat;  
                        // テーブルから対象のデータを取得  
                        var target = table.Single(x => x.No == cat.No);  
                        // データ削除  
                        table.DeleteOnSubmit(target);  
                        // DBの変更を確定  
                        context.SubmitChanges();  
                    }  
                    conn.Close();  
                }  

                // データ再検索  
                searchData();  

                MessageBox.Show("データを削除しました。");  
            }

 

削除は単純ですね。

まとめ


前回に引き続き、LINQを使ってのデータ追加、更新、削除をしてみましたが
分かってしまえばとても楽に実装できるもんですね。

もう少し複雑なことをやろうとしたら
またそれなりに学ぶ必要がありそうですが、しばらくさわってみようと思います。

ではでは。

記事が少しでもいいなと思ったらクラップを送ってみよう!
18
+1
@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする