VB2008のSQL周りでDapperを使用するまとめ
ここの所、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を指定し、Dapperを取得します。
Nuget.exe install dapper*1
ローカルにフォルダーが生成され、Frameworkのバージョン毎にdllが作成されています。
今回はVB2008なので、「net35」を使用します。
中に「Dapper.dll」があるので、これをVB2008側で参照設定すればOKです。
環境
- Visual Studio 2008 SP1
- SQL Server 2008
- DBはNorthwindを使用
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
はい、これで・・・。
エラーが出ました。何故?
「前に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を保存したパスで行ってください