VB.NET で Dapper を使って Oracle に接続してみました。
Dapper というのは .net 用の MicroORM のことです。概要はこちらを。
- SELECT の場合(動的オブジェクトで戻してもらう場合)
Dim connstr = "User Id=scott; Password=*****; Data Source=*****" Using cn As System.Data.IDbConnection = New Oracle.DataAccess.Client.OracleConnection(connstr) cn.Open() Dim result = cn.Query( _ "select * from EMP where EMPNO <= :empno", _ New With {.empno = "7800"}) ' 一つずつ拾う For Each x In result Debug.Print(x.ENAME) Next cn.Close() End Using
特筆すべきは、バインド変数の値を動的オブジェクトを使って与えられるところでしょうか。Parameter.Add が必要がありません。
ただ、この場合は動的オブジェクトで戻るのでインテリセンスは効きません(汗 - SELECT の場合(事前にクラスを用意し、それに MAP したい場合)
Dim connstr = "User Id=scott; Password=*****; Data Source=*****" Using cn As System.Data.IDbConnection = New Oracle.DataAccess.Client.OracleConnection(connstr) cn.Open() Dim result = cn.Query(Of EMP)( _ "select * from EMP where EMPNO <= :empno", _ New With {.empno = "7800"}) ' 一つずつ拾う For Each x In result Debug.Print(x.ENAME) Next cn.Close() End Using
Query メソッドに MAP したいクラスの型名を与えてやるだけです。
クラスの定義はごく普通に。クラス内にある Private クラスでよいし、メンバーも Property ではなく Field で OK のようです。
ポイントは、SELECT 側の列型名とクラス側のメンバー変数名を同じにしておくこと。Private Class EMP Public EMPNO As Integer Public ENAME As String Public JOB As String Public MGR As Integer Public HIREDATE As Date Public SAL As Decimal Public COMM As Decimal Public DEPTNO As Integer End Class
- Insert の場合
Dim connstr = "User Id=scott;Password=*****;Data Source=*****" Using cn As System.Data.IDbConnection = New Oracle.DataAccess.Client.OracleConnection(connstr) cn.Open() Using tr = cn.BeginTransaction cn.Execute("insert into EMP (EMPNO) values (:EMPNO)", {New With {.EMPNO = 30}, New With {.EMPNO = 40}}) tr.Commit() End Using cn.Close() End Using
なんと 単純変数だけでなく Collection も渡すことができます。上記は直接配列を作成していますが、ここに List(Of Object) な変数を充てても動作します。