Visuual Basic .NET(VS .NET 2019, .NET Core 3.1)環境でSQLite3を使った。
- SQLite3 関連のNuGetライブラリは乱立していて依存関係は複雑
- 検索ではC#の記事が多く直接VB .NETで使えない
であったため備忘録を残す。
1.依存ライブラリのインストール
Visual Studio のメニューから『ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理 』を辿り、『sqlite-net-pcl』で検索してインストールする
※このライブラリは他に依存関係ダウンロードはなくとも正常に動作した
2.クラスの作成
メニューの『プロジェクト→クラスの追加』でTestTable.vb というデータ格納用のテーブルを作成する。
Imports SQLite
Public Class TestTable
<AutoIncrement, PrimaryKey>
Public Property id As Integer
Public Property description As String
Public Sub New(description As String)
_description = description
End Sub
Public Sub New() ‘引数なしのコンストラクタが必要
End Sub
End Class
気になるのは2点。
2.1.<AutoIncrement, PrimaryKey>の部分
SQLiteのDB向けアノテーションで、id フィールドがAutoIncrement, Primary Keyと手軽に設定出来てしまうので便利だ。
2.2.Public Sub New()の部分
引数を持たないPublic Sub Newの定義は必須となっている。SQLiteが自動的にインスタンスを生成するのに要る様子
3.DB・テーブル作成、INSERT、UPDATE、DELETE、SELECT
GUI上でボタンを作成し、ダブルクリックで後述の関数(ButtonDebug_Click)の中身を実装する。デモとして用意したボタンクリック時の処理フローは以下の通り。
3.1.ボタンクリック時の処理フロー
- Test.db DBを作成する
- テーブルを作成する
- 20件レコードINSERT
- ID>10のレコードのみ取得し、IDが5の倍数なら削除 or descriptionの末尾に”Updated”を付与する
- データ全件SELECT・出力
3.2.関数の中身
Private Sub ButtonDebug_Click(sender As Object, e As EventArgs) Handles ButtonDebug.Click
‘1.Test.db DBを作成する
Using connection = New SQLiteConnection(“Test.db”)
‘2.テーブルを作成する
connection.CreateTable(Of TestTable)()
‘3.20件レコードINSERT
For i As Integer = 1 To 20
Dim NewItem = New TestTable(“description” & i)
connection.Insert(NewItem)
Next
‘4.ID>10のレコードのみ取得し、IDが5の倍数なら削除 or descriptionの末尾に”Updated”を付与する
Dim Items = connection.Table(Of TestTable)().Where(Function(x) x.id > 10)
For Each Item In Items
If Item.id Mod 5 = 0 Then
‘IDが5の倍数の場合削除
connection.Delete(Item)
Debug.WriteLine(“DELETE: id:{0}”, Item.id)
Else
‘IDが5の倍数でなければ更新する
Item.description = Item.description & “Updated”
connection.Update(Item)
Debug.WriteLine(“UPDATE: id:{0}”, Item.id)
End If
Next
‘5.データ全件SELECT・出力
Items = connection.Table(Of TestTable)()
For Each Item In Items
Debug.WriteLine(“SELECT: id:{0}, description:{1}”, Item.id, Item.description)
Next
Debug.WriteLine(“done”)
End Using
End Sub
- Test.db を指定している部分でDBファイル名を指定
- CreateTableで型を指定すればその型のDBテーブルが生成される
- インスタンスを引数に設定してInsert/Update/Deleteを呼び出せば手軽にレコードのCUDが可能
- SELECTは更に簡単で、LinqでTable(Of ClassName)() を扱えば良い。ただし『WHEREでMod』のような条件は不可
SQLなしで手軽に作れるのがやりやすくて便利。※SQLで取得したい場合は以下のように取得すればよい
Dim x = connection.Query(Of TestTable)(“SELECT * FROM TestTable WHERE description=?”, “QueryCondition”)
3.3.実行結果出力
UPDATE: id:11
UPDATE: id:12
UPDATE: id:13
UPDATE: id:14
DELETE: id:15
UPDATE: id:16
UPDATE: id:17
UPDATE: id:18
UPDATE: id:19
DELETE: id:20
SELECT: id:1, description:description1
SELECT: id:2, description:description2
SELECT: id:3, description:description3
SELECT: id:4, description:description4
SELECT: id:5, description:description5
SELECT: id:6, description:description6
SELECT: id:7, description:description7
SELECT: id:8, description:description8
SELECT: id:9, description:description9
SELECT: id:10, description:description10
SELECT: id:11, description:description11Updated
SELECT: id:12, description:description12Updated
SELECT: id:13, description:description13Updated
SELECT: id:14, description:description14Updated
SELECT: id:16, description:description16Updated
SELECT: id:17, description:description17Updated
SELECT: id:18, description:description18Updated
SELECT: id:19, description:description19Updated
done
予定通りID:11~20のうち15,20のみDELETEされた
結果としてID:11~14,16~19のdescriptionにUpdatedが付与された
⇒想定通りの動作