📝

【VB.NET】Dapperの使用方法まとめ

2023/12/25に公開

VB.NET と Dapper を用いたデータアクセスのガイド

Dapperとは

Dapperは、.NET用の軽量なオブジェクトリレーショナルマッパー(ORM)です。Stack Overflowチームによって開発され、パフォーマンスと開発者の生産性を重視して設計されています。DapperはADO.NETの機能を拡張し、データベース操作を簡単かつ効率的に行うことができます。SQLクエリの実行、結果セットのマッピング、パラメータの処理など、データベースアクセスに関連する多くの機能を提供します。

Dapperは、クエリの結果をPOCO(Plain Old CLR Object)に直接マッピングすることができ、LINQやEntity FrameworkなどのフルORMよりもシンプルで高速なデータアクセスを実現します。
Dapperの詳細については、以下の公式サイトを参照してください。

https://github.com/DapperLib/Dapper

概要

このドキュメントでは、.NET Framework 4.8 と VB.NET を用いて、Dapper ORM を使用したデータベース操作の方法を詳細に解説します。具体的な操作例として、customer テーブル(列:id, name, gender, mail)を用います。

モデルの定義

Public Class Customer
    Public Property Id As Integer
    Public Property Name As String
    Public Property Gender As String
    Public Property Mail As String
End Class

基本的なデータ取得

特定の条件に基づくデータの取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim gender As String = "男性"
    Dim customers As IEnumerable(Of Customer) = conn.Query(Of Customer)("SELECT * FROM customer WHERE gender = @Gender", New With {.Gender = gender})
End Using

パラメータを使った検索

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim searchTerm As String = "%検索語%"
    Dim customers As IEnumerable(Of Customer) = conn.Query(Of Customer)("SELECT * FROM customer WHERE name LIKE @SearchTerm", New With {.SearchTerm = searchTerm})
End Using

ソートと制限を伴うデータの取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim customers As IEnumerable(Of Customer) = conn.Query(Of Customer)("SELECT TOP 10 * FROM customer ORDER BY name")
End Using

複数のテーブルからのデータ取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim query As String = "SELECT c.*, o.OrderDate FROM customer c INNER JOIN orders o ON c.id = o.CustomerId"
    Dim customerOrders As IEnumerable(Of CustomerWithOrders) = conn.Query(Of CustomerWithOrders)(query)
End Using

ダイナミッククエリの実行

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim dynamicParams As New DynamicParameters()
    dynamicParams.Add("@Gender", "男性")
    dynamicParams.Add("@Name", "%名%")

    Dim customers As IEnumerable(Of Customer) = conn.Query(Of Customer)("SELECT * FROM customer WHERE gender = @Gender AND name LIKE @Name", dynamicParams)
End Using

IN句を使用したデータの取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim ids As Integer() = {1, 2, 3}
    Dim customers As IEnumerable(Of Customer) = conn.Query(Of Customer)("SELECT * FROM customer WHERE id IN @Ids", New With {.Ids = ids})
End Using

動的型でのデータ取得

基本的な動的型でのデータ取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim customers As IEnumerable(Of Object) = conn.Query("SELECT * FROM customer")
    For Each customer In customers
        Console.WriteLine(customer.name)
    Next
End Using

複数のテーブルから動的型でのデータ取得

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim query As String = "SELECT c.*, o.OrderDate FROM customer c INNER JOIN orders o ON c.id = o.CustomerId"
    Dim results As IEnumerable(Of Object) = conn.Query(query)

    For Each result In results
        Console.WriteLine($"{result.name} - {result.OrderDate}")
    Next
End Using

データの挿入(Insert)

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim newCustomer As New Customer With {.Name = "新しい顧客", .Gender = "男性", .Mail = "email@example.com"}
    Dim result As Integer = conn.Execute("INSERT INTO customer (name, gender, mail) VALUES (@Name, @Gender, @Mail)", newCustomer)
End Using

データの更新(Update)

Using conn As New SqlConnection(connectionString)
    conn.Open()
    Dim existingCustomer As New Customer With {.Id = 1, .Name = "更新された顧客", .Gender = "女性", .Mail = "updated@example.com"}
    Dim result As Integer = conn.Execute("UPDATE customer SET name = @Name, gender = @Gender, mail = @Mail WHERE id = @Id", existingCustomer)
End Using

Discussion