SQLiteをVisual Basic .NET で使う

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.ボタンクリック時の処理フロー

  1. Test.db DBを作成する
  2. テーブルを作成する
  3. 20件レコードINSERT
  4. ID>10のレコードのみ取得し、IDが5の倍数なら削除 or descriptionの末尾に”Updated”を付与する
  5. データ全件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が付与された

⇒想定通りの動作