taediumの日記

2012-12-22

[][] Soma 1.8.0.6 リリース

.NETで使えるO/Rマッパー、Soma 1.8.0.6 をリリースしました(10日ほど前に)。


ODP.NETでメモリリークする可能性があったのを修正しています。

  • Fix - Dispose DbParameters and those values to prevent memory leak in ODP.NET environment
  • Fix - Consume all DbDataReaders to prevent memory leak in ODP.NET environment

ダウンロードはこちらからどうぞ。

GitHubが、ファイルのアップロードをサポートしなくなったので、今後は以前のようにcodeplexのダウンロードページを使ってきます。


Nugetもあります。

PM> Install-Package Soma

SomaはF#2.0のアセンブリ(FSharp.Core 4.0.0.0)に依存していますが、F#3.0(FSharp.Core 4.3.0.0)でももちろん動きます。F#3.0が入っている環境では、app.configやweb.configに次のように書いてください。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral">
        </assemblyIdentity>
        <bindingRedirect oldVersion="4.0.0.0" newVersion="4.3.0.0">
        </bindingRedirect>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

NugetのAdd-BindingRedirectコマンドを使えば勝手に上記と同等の設定してくれます。


F#のプロジェクトでNuGet使ってインストールするとAdd-BindingRedirectが裏で動いているみたいなんですが、C#のプロジェクトではそうでもないようです。自分の環境で試したら、違いがあったんですが、理由は追っていないです。

2012-06-23

[][] Soma 1.8.0.0 リリース

.NET向けO/Rマッパー Soma 1.8.0.0 をリリースしました。


ダウンロードはこちらからどうぞ。


動かしてみたいという方はクイックスタートをどうぞ。


リリースノート

New Feature
  • Soma.Core.CharStringというクラスを追加しました。このクラスを使うとStringをDBの固定長文字列にマッピングできます。
  • charStringと charStringListという関数を式言語で使えるようにしました。これらの関数でStringやStringのコレクションをDBの固定長文字列にマッピングできます。つまり、マッピングしたい文字列の長さが固定長に満たない場合に自動でパディングされます(ただし、ADO.NETのプロバイダがサポートしている必要があります)。
Change
  • SQLのバインド変数のテストデータにNプレフィックスな文字列を指定可能にしました。
  • UniqueConstraintExceptionから原因となった例外を取得できるようにしました。
Fix
  • Oracleのストアドプロシージャーでバインド名がうまくマッピングされない問題を修正しました。

2011-12-02

[][] Soma 1.6.0.0 リリース

F#で作ったO/Rマッパー Soma 1.6.0.0をリリースしました。F#はもちろん、C#やVB.NETもサポートしています。

リリースノート
  • New Feature - IConnectionObserverとICommandObserverを追加しました。
  • Change - Soma.Core.Db classがFSharpのリストを条件パラメータとして受け入れるようにしました。
  • Fix - 式においてIDictionary<TKey, TValue>を正しくサポートしました。

約3ヶ月ぶりのリリースになりました。

2011-08-21

[][] Stateモナドでコネクション管理

これは結構使える!かも。

open System
open System.Transactions
open FSharp.Monad.State
open Soma.Core

let config = 
  { new MsSqlConfig() with
    member this.ConnectionString = "Data Source=.;Initial Catalog=Soma.Tutorial;Integrated Security=True" }

let getConnection() = state {
  let! conOption = getState
  let con =
    match conOption with
    | Some con -> con
    | _ -> LocalDb.createConnection config
  do! putState (Some con)
  return con }

let find<'T when 'T : not struct> id = state { 
  let! con = getConnection()
  return LocalDb.find<'T> config con id }

let insert<'T when 'T : not struct> entity = state { 
  let! con = getConnection()
  return LocalDb.insert<'T> config con entity }

let update<'T when 'T : not struct> entity = state { 
  let! con = getConnection()
  return LocalDb.update<'T> config con entity }

let delete<'T when 'T : not struct> entity = state { 
  let! con = getConnection()
  LocalDb.delete<'T> config con entity }

let requiredTx m = 
  use tx = new TransactionScope(TransactionScopeOption.Required)
  let result = eval m None
  tx.Complete()
  result

type Employee = 
  { [<Id(IdKind.Identity)>]
    EmployeeId : int 
    EmployeeName : string
    DepartmentId : int
    [<Version>]
    VersionNo : int }

let exec2 emp = state {
  do! delete emp }

let exec() = state {
  let! emp = insert { EmployeeId = 0; EmployeeName = "Allen"; DepartmentId = 2; VersionNo = 0}
  let! emp = find<Employee> [emp.EmployeeId]
  let! emp = update { emp with EmployeeName = "Hoge" }
  do! exec2 emp
  return emp }

exec() 
|> requiredTx
|> printfn "%A"

Console.ReadKey() |> ignore


[][] Soma 1.5.0.0 リリース

Soma 1.5.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。

ダウンロードはこちら。

NuGetを使って簡単にセットアップできます。

Release Notes
  • New Feature - DbクラスやLocalDbクラスにおいて、POCO、System.Collections.IDictionary、System.Collections.Generics.IDictionary<TKey, TValue>を検索条件パラメータとして利用することをサポートしました。
  • New Feature - 新しい関数とメソッドを追加し、DbDataReaderの直接的なハンドリングをサポートしました。
  • New Feature - IDynamicObjectでICustomTypeDescriptorを継承し、データバインディングをサポートしました。
  • Change - ページネーションに関する関数とメソッドのシグネチャを変えました。limitとoffsetのパラメータの型がInt32からInt64になりました.
  • Change - NuGetパッケージ FSPowerPack.Core.Community 2.0.0.0 を採用しました。
  • Fix - 冗長なConnecionStringのチェックを行わないようにしました。

[][] Soma 1.5.0.0 の新機能紹介

C#のコードで紹介します。


検索条件パラメータでIDictionary等の利用をサポート

これまでは、検索条件パラメータは匿名型のみをサポートしてました。

var empList = db.Query<Employee>(
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new { DepartmentId = 1, EmployeeName = "Smith" });

1.5.0.0ではIDictionary型などもサポートしました。例えばHashtableを使えます。

var empList = db.Query<Employee>(
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new Hashtable { { "DepartmentId", 1 }, { "EmployeeName", "Smith" } });

DbDataReaderのハンドリングのサポート

Somaは、DbDataReaderをPOCO、dynamic(dynamicはIDictionary<TKey, TValue>でもある)、タプルなどの型にマッピングできますが、場合によってはDbDataReaderを直接触りたいということもあるかと思います。そういったケースに対応できるようにしました。例えば、DbDataReaderをDataTableにロードできます。

DataTable table = db.ExecuteReader(
    reader =>
    {
        var t = new DataTable();
        t.Load(reader);
        return t;
    }, 
    "select * from Employee e where e.DepartmentId = /* DepartmentId */0 and e.EmployeeName = /* EmployeeName */''", 
    new {DepartmentId = 1, EmployeeName = "Smith"});

第一引数のFunc<DbDataReader, T>が返した値がそのままExecuteReaderメソッドの戻り値になります。


データバインディングのサポート

Queryメソッドなどの型パラメータにdynamicを指定した場合に、データバインディング可能なオブジェクトを返すようにしました。

たとえば、Window Formで次のようなコードを記述すると

var empList = db.Query<dynamic>("select * from Employee");
dataGridView1.DataSource = empList;

次のように表示されます。

f:id:taedium:20110821131157p:image

プロトタイピングなどで楽だと思います。


今回のリリースにあたっては、http://soma.codeplex.com/discussions/269435 にてnikochan2kさんからいろいろとフィードバックをいただいた結果を反映させています。フィードバックありがとうございました。

2011-08-04

[][] Soma 1.4.0.0 リリース

Soma 1.4.0.0をリリースしました。SomaはF#で作ったO/Rマッパーです。(F#はもちろんC#やVB.NETでも使えます)。

ダウンロードはこちら。

NuGetを使って簡単にセットアップできます。

Release Notes
  • Change - 式コメントで非アスキー文字からなる識別子をサポートしました。
  • Fix - 単一のString型の主キーをfind関数やFindメソッド等で正しく認識するようにしました。
  • Fix - SQL Server利用時にUniqueConstraintExceptionを正しくハンドリングするようにしました。