modest violet

読者です 読者をやめる 読者になる 読者になる

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

VB2008のSQL周りでDapperを使用するまとめ

Dev Dev-VB.NET Dev-VB6


f:id:shin21sk:20160418182432p:plain

ここの所、Dapperの虜になっています。

Dapper-dot-net
GitHub - StackExchange/dapper-dot-net: Dapper - a simple object mapper for .Net

Dapper(ダッパー)とは

データベースの操作を簡単にしてくれるORマッパーの一種。

非常に軽量で、高速な動作が実現可能です。

色々とクセもあるんですが、とにかく今の気持ちはズバリ、

Dapper素敵すぎ!


未だにVB案件が多い為、VBでもDapperが使いたい!」という欲求を抑えきれず、導入する事にしました。

・・・が。

Visual Studio 2008にはNuGetが無かったよ・・・』


NuGetの準備

NuGetとは、Visual Studio拡張機能として付属しているライブラリのパッケージ管理システムです。 ライブラリの導入から、管理、アップデートまで簡単に行うことができる他、他のライブラリとの依存関係を自動的に解決することができます。
引用:Qiita C++プロジェクトでNuGetを使ってみようよ!(Vol. 1:パッケージ導入編)
http://qiita.com/nia_tn1012/items/77c3c1b006f7c69d30ac


Visual Studioからは利用できないので、NuGetのCommandlineツールから取得を行います。

まず、公式サイトでNuGet本体をダウンロードします。

NuGet Distributions

f:id:shin21sk:20160418180311j:plain

次に、コマンドプロンプトからNuGetを指定し、Dapperを取得します。

Nuget.exe install dapper*1

f:id:shin21sk:20160418180602j:plain

ローカルにフォルダーが生成され、Frameworkのバージョン毎にdllが作成されています。

今回はVB2008なので、「net35」を使用します。

f:id:shin21sk:20160418180615j:plain

中に「Dapper.dll」があるので、これをVB2008側で参照設定すればOKです。

f:id:shin21sk:20160418180628j:plain

環境

SELECT


まず小手始めにNorthwindのCustomersテーブルから一覧を取得してみます。

結果を受け取る為のクラスを作成します。

Public Class Customer

    Public CustomerID As String
    Public CompanyName As String
    Public ContactName As String
    Public ContactTitle As String
    Public Address As String
    Public City As String
    Public Region As String
    Public PostalCode As String
    Public Country As String
    Public Phone As String
    Public Fax As String 

End Class

実はこの書き方。

後で痛い目に遭うのですが、ひとまずこのままで進めます。


次にメインとなるSELECT処理です。

' 接続文字列には任意の値を入れます
Using connection = New SqlClient.SqlConnection("接続文字列")

    connection.Open()

    ' SELECTの結果が指定したCustomerクラスに自動でマッピングされます
    Dim customers = connection.Query(Of Customer)("SELECT * FROM Customers ", Nothing)

    For Each customerItem In customers
        Console.WriteLine(customerItem.CompanyName)
    Next

    connection.Close()

End Using

めちゃ簡単ですね。。。

次にINSERTです。

INSERT

' 接続文字列には任意の値を入れます
Using connection = New SqlClient.SqlConnection("接続文字列")

    connection.Open()

    ' INSERT文
    Dim query = "INSERT INTO Customers VALUES ( @CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax ) "

    ' Customerクラスに登録値をセットする
    Dim customer = New Customer() With {.CustomerID = "JAPAN", _
                                        .CompanyName = "Japan", _
                                        .ContactName = "MODEST", _
                                        .ContactTitle = "Owner", _
                                        .Address = "Build.", _
                                        .City = "Tokyo", _
                                        .PostalCode = "110-1111", _
                                        .Country = "JPN", _
                                        .Phone = "03-xxxx-xxxx"}

    connection.Execute(query, customer)

    connection.Close()

End Using

はい、これで・・・。

エラーが出ました。何故?

f:id:shin21sk:20160418180850j:plain


「前にC#で作った時はこの書き方で問題なく動いたのになぁ・・・」と情報を漁ること数時間。。。


SELECTがすんなり動いたので、気にも留めませんでしたが、クラスはPropertyで宣言しないと駄目なようです。

Public Class Customer

    Protected _customerID As String

    Public Property CustomerID() As String
        Get
            Return _customerID
        End Get
        Set(ByVal value As String)
            _customerID = value
        End Set
    End Property

    以下、略

End Class


Property修飾子の宣言がVBではやっぱり面倒ですね。

さて、改めてInsertを試した所、すんなり登録出来ました。

プロパティ大事。

他にDapperの好きな所

IN句の指定が楽

地味な部分ですが、これが結構ポイント高いんですよね。

例えば、hoge001からhoge010までの10個の値をSQL文で書くとこうなります。

SELECT * FROM hoge FROM hogeNo in (@hoge001, @hoge002,<中略>, @hoge010)

そして各パラメーターに対して値をセットしていく必要があります。

Dapperだと、こういう書き方になります。

Dim hoges as New List<Of hogeNo>
' ここに値をセットする処理


' SQL実行
connection.Query(Of Customer)("SELECT * FROM hoge FROM hogeNo in @hoges ", New With { .hoges = hoges })

IN句の後ろにリストを渡してあげるだけで、勝手にパラメーターを必要な数だけ準備してくれるんですね。

これは便利。地味に便利。

というか好き

まとめ

・VB2008で使う場合はNuGet CommandlineからDapper.dllを取得する

・値を受け取るクラスはParameter修飾子で宣言する

*1:NuGet.exeを保存したパスで行ってください