【VB.NET】SQLiteに接続してデータを登録してみる
おはようございます。
VBでSQLite、データ検索までしたので続いて登録、更新、削除をしてみました。
C#からの移植ではありますが、微妙に違うところもありますね。
プログラムは前回のものを流用します。
スポンサーリンク
画面の修正
画面に追加、更新、削除ボタンを追加し、それぞれにクリックイベントを設定します。
プログラム修正
検索処理の修正
追加更新削除後に再検索するため、別メソッドに切り出します。
''' <summary>
''' 検索ボタンクリックイベント.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
search()
End Sub
''' <summary>
''' 検索処理
''' </summary>
Private Sub search()
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' 検索条件を指定してデータを取得
Using con As New DataContext(conn)
Dim searchName As String = txtName.Text
Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd
Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat)
Dim result As IQueryable(Of Cat)
If (searchKind = "") Then
' 種別が選択されていなければ名前のみ前方一致指定
result = From x In tblCat
Where x.Name.StartsWith(searchName)
Order By x.No
Select x
Else
' 種別が選択されていれば名前+種別で検索
result = From x In tblCat
Where x.Name.StartsWith(searchName) And x.KindCd = searchKind
Order By x.No
Select x
End If
' データグリッドビューに設定
dgvCat.DataSource = result.ToList()
End Using
' データベースクローズ
conn.Close()
End Using
End Sub
データ追加
''' <summary>
''' 追加ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ追加
Using con As New DataContext(conn)
' 対象のテーブルオブジェクトを取得
Dim Table = con.GetTable(Of Cat)
' データ作成
Dim Cat As New Cat()
Cat.No = 5
Cat.Name = "こなつ"
Cat.Sex = "♀"
Cat.Age = 7
Cat.KindCd = "01"
Cat.Favorite = "布団"
' データ追加
Table.InsertOnSubmit(Cat)
' DBの変更を確定
con.SubmitChanges()
End Using
conn.Close()
End Using
' データ再検索
search()
MessageBox.Show("データを追加しました。")
End Sub
追加ボタンをクリックすると、固定ではありますがデータが追加されます。
データ更新
''' <summary>
''' 更新ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ更新
Using con As New DataContext(conn)
' 対象のテーブルオブジェクトを取得
Dim Table = con.GetTable(Of Cat)
' 選択されているデータを取得
For Each r As DataGridViewRow In dgvCat.SelectedRows
Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index)
' テーブルから対象のデータを取得
Dim target As Cat = Table.Single(Function(x As Cat) x.No = Cat.No)
' データ変更
target.Favorite = "高いところ"
' DBの変更を確定
con.SubmitChanges()
Next
End Using
conn.Close()
End Using
' データ再検索
search()
MessageBox.Show("データを更新しました。")
End Sub
更新ボタンをクリックすると、選択された行の好物が更新されます。
データ削除
''' <summary>
''' 削除ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ削除
Using con As New DataContext(conn)
' 対象のテーブルオブジェクトを取得
Dim Table = con.GetTable(Of Cat)
' 選択されているデータを取得
For Each r As DataGridViewRow In dgvCat.SelectedRows
Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index)
' テーブルから対象のデータを取得
Dim target As Cat = Table.Single(Function(x As Cat) x.No = Cat.No)
' データ削除
Table.DeleteOnSubmit(target)
' DBの変更を確定
con.SubmitChanges()
Next
End Using
conn.Close()
End Using
' データ再検索
search()
MessageBox.Show("データを削除しました。")
End Sub
削除ボタンをクリックすると、選択されている行のデータが削除されます。
まとめ
とりあえず簡単ではありますが追加、更新、削除ができました。
次回はデータグリッドを直接編集してデータの更新等が行えるようにしたいと思います。
ではでは。
ディスカッション
コメント一覧
お世話になっております。
前項での素早い対応ありがとうございました。
さて、ここも検索処理の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練習中断者様
ブログを見ていただきありがとうございます。
ご指摘の件、
すみません時間が取れなくてなかなか対応できませんが、
修正予定です。
引き続きよろしくお願いします。