【VB.NET】SQLiteに接続してデータを登録してみる
おはようございます。
VBでSQLite、データ検索までしたので続いて登録、更新、削除をしてみました。
C#からの移植ではありますが、微妙に違うところもありますね。
プログラムは前回のものを流用します。
スポンサーリンク
画面の修正
画面に追加、更新、削除ボタンを追加し、それぞれにクリックイベントを設定します。
プログラム修正
検索処理の修正
追加更新削除後に再検索するため、別メソッドに切り出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | ''' <summary> ''' 検索ボタンクリックイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnSearch_Click(sender AsObject,eAsEventArgs)HandlesbtnSearch.Click search() EndSub ''' <summary> ''' 検索処理 ''' </summary> PrivateSubsearch() Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con AsNewDataContext(conn) DimsearchName AsString=txtName.Text DimsearchKind AsString=CType(cmbKind.SelectedValue,Kind).KindCd DimtblCat AsTable(Of Cat)=con.GetTable(Of Cat) Dimresult AsIQueryable(Of Cat) If(searchKind="")Then ' 種別が選択されていなければ名前のみ前方一致指定 result=FromxIn tblCat Wherex.Name.StartsWith(searchName) Order Byx.No Selectx Else ' 種別が選択されていれば名前+種別で検索 result=FromxIn tblCat Wherex.Name.StartsWith(searchName)Andx.KindCd=searchKind Order Byx.No Selectx EndIf ' データグリッドビューに設定 dgvCat.DataSource=result.ToList() EndUsing ' データベースクローズ conn.Close() EndUsing EndSub |
データ追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | ''' <summary> ''' 追加ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnAdd_Click(sender AsObject,eAsEventArgs)HandlesbtnAdd.Click Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ追加 Using con AsNewDataContext(conn) ' 対象のテーブルオブジェクトを取得 DimTable=con.GetTable(Of Cat) ' データ作成 DimCat AsNewCat() Cat.No=5 Cat.Name="こなつ" Cat.Sex="♀" Cat.Age=7 Cat.KindCd="01" Cat.Favorite="布団" ' データ追加 Table.InsertOnSubmit(Cat) ' DBの変更を確定 con.SubmitChanges() EndUsing conn.Close() EndUsing ' データ再検索 search() MessageBox.Show("データを追加しました。") EndSub |
追加ボタンをクリックすると、固定ではありますがデータが追加されます。
データ更新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnUpdate_Click(sender AsObject,eAsEventArgs)HandlesbtnUpdate.Click Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ更新 Using con AsNewDataContext(conn) ' 対象のテーブルオブジェクトを取得 DimTable=con.GetTable(Of Cat) ' 選択されているデータを取得 For EachrAsDataGridViewRow In dgvCat.SelectedRows DimCat AsCat=CType(dgvCat.DataSource(),List(Of Cat)).Item(r.Index) ' テーブルから対象のデータを取得 Dimtarget AsCat=Table.Single(Function(xAsCat)x.No=Cat.No) ' データ変更 target.Favorite="高いところ" ' DBの変更を確定 con.SubmitChanges() Next EndUsing conn.Close() EndUsing ' データ再検索 search() MessageBox.Show("データを更新しました。") EndSub |
更新ボタンをクリックすると、選択された行の好物が更新されます。
データ削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | ''' <summary> ''' 削除ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> PrivateSubbtnDelete_Click(sender AsObject,eAsEventArgs)HandlesbtnDelete.Click Using conn AsNewSQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ削除 Using con AsNewDataContext(conn) ' 対象のテーブルオブジェクトを取得 DimTable=con.GetTable(Of Cat) ' 選択されているデータを取得 For EachrAsDataGridViewRow In dgvCat.SelectedRows DimCat AsCat=CType(dgvCat.DataSource(),List(Of Cat)).Item(r.Index) ' テーブルから対象のデータを取得 Dimtarget AsCat=Table.Single(Function(xAsCat)x.No=Cat.No) ' データ削除 Table.DeleteOnSubmit(target) ' DBの変更を確定 con.SubmitChanges() Next EndUsing conn.Close() EndUsing ' データ再検索 search() MessageBox.Show("データを削除しました。") EndSub |
削除ボタンをクリックすると、選択されている行のデータが削除されます。
まとめ
とりあえず簡単ではありますが追加、更新、削除ができました。
次回はデータグリッドを直接編集してデータの更新等が行えるようにしたいと思います。
ではでは。
ディスカッション
コメント一覧
お世話になっております。
前項での素早い対応ありがとうございました。
さて、ここも検索処理の38行目の&がANDみたいですね。
それにてばっちり動きました。
おっと、追伸です。
この記事の続きの
———–
【VB.NET】DataGridView を直接変更してデータを更新してみる
https://www.doraxdora.com/blog/2017/12/27/post-3564/
———–
が、まえと同じように「サイトに重大なエラーがありました。」のエラーで閲覧不可能状態になっております。
お手すきの時にでも確認をよろしくお願いいたします。
匿名希望様
ご指摘ありがとうございます。
記事を修正致しましたのでご確認をお願いします。
今後もよろしくお願いします。
こんにちは。
VBとDBの勉強に利用させていただいております。ありがとうございます。
まるごとコピーして同じサンプルを作り上げてみたつもりなのですが、削除ボタンを押すと
ハンドルされていない例外としてSystem.NullReferenceException:オブジェクト参照がオブジェクトインスタンスに設定されていません。と、でて止まってしまいます。
VB.net上でエラー箇所として黄色く反転表示される行はこのページでいうと、削除ボタンクリックイベント関数の20行目、
Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index)
ってところなのですが・・・
他の機能はうまく動いているようなのですが、何が問題なのかわからない状態です。
何かおわかりになりますでしょうか?
いつもブログを見ていただきありがとうございます。
ご質問の件、
前回までの記事もご覧になられたでしょうか?
おそらくですが、データソースが取得できずにキャストがうまくいっていないのかと思います。
データベースにデータが存在するか、ご確認をお願いします。
あー、おそらくはSqliteシリーズの記事を全部読んで最後まで作ったんじゃないかな?
途中からデータソースに指定するんじゃなくてdatagridviewに直接描写してる作りになってるけど
削除ボタンクリックイベントに関しては対応させてないっぽい。もしくは記述漏れ。
管理人様、sqliteの最終版である
https://www.doraxdora.com/blog/2017/12/28/post-3569/
こちらでも動く削除ボタンのコードサンプル、追記をお願いできないでしょうか?
たしかにこちらの
https://www.doraxdora.com/blog/2017/12/27/post-3564/
検索処理41行目の
> ‘dgvCat.DataSource = result.ToList()
で、データソースを使う方法から変更されているようです。
VB練習中断者様
ブログを見ていただきありがとうございます。
ご指摘の件、
すみません時間が取れなくてなかなか対応できませんが、
修正予定です。
引き続きよろしくお願いします。