目次

概要

Somaでは、設定情報を Soma.Core.IDbConfig インタフェースで表します。
設定情報には、接続文字列やSQLのログ出力方法を指定します。

IDbConfigの実装クラスは、SomaがサポートするRDBMSごとに用意されています。

接続文字列

接続文字列を指定するには、Soma.Core.IDbConfig インタフェースの ConnectionString プロパティを実装します。
RDBMSごとの設定例を示します。

Microsoft SQL Server 2008 の利用

Microsoft SQL Server 2008 を利用するには、Soma.Core.MsSqlConfig の ConnectionString プロパティに接続文字列を指定します。

F#
open Soma.Core

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

C#
using Soma.Core;

public class Config : MsSqlConfig
{
    public override string ConnectionString { get { return "Data Source=.;Initial Catalog=Example;Integrated Security=True"; } }
}

前提として、次のような設定がmachine.configやapp.configなどの構成ファイルに記載されている必要があります。

xml
<system.data>
    <DbProviderFactories>
        <add name="SqlClient Data Provider" 
            invariant="System.Data.SqlClient"
            description=".Net Framework Data Provider for SqlServer" 
            type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </DbProviderFactories>
</system.data>

Microsoft SQL Server Compact 4.0 の利用

Microsoft SQL Server Compact 4.0 を利用するには、Soma.Core.MsSqlCeConfig の ConnectionString プロパティに接続文字列を指定します。 (Microsoft SQL Server Compact 4.0 を利用するには、ランタイム が別途必要です。)

F#
open Soma.Core

let config = 
  { new MsSqlCeConfig() with
    member this.ConnectionString = "Data Source=..\..\Example.sdf" }

C#
using Soma.Core;

public class Config : MsSqlCeConfig
{
    public override string ConnectionString { get { return "Data Source=..\..\Example.sdf"; } }
}

前提として、次のような設定がmachine.configやapp.configなどの構成ファイルに記載されている必要があります。

xml
<configuration>
    <system.data>
        <DbProviderFactories>
            <add name="Microsoft SQL Server Compact Data Provider 4.0" 
                invariant="System.Data.SqlServerCe.4.0" 
                description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
                type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        </DbProviderFactories>
    </system.data>
</configuration>

MySQL 5.x の利用

MySQLを利用するには、Soma.Core.MySqlConfig の ConnectionString プロパティに接続文字列を指定します。(MySQL 5.x を利用するには、ADO.NET Driver for MySQL が別途必要です。)

F#
open Soma.Core

let config = 
  { new MySqlConfig() with
    member this.ConnectionString = "server=localhost;User Id=hoge;Password=foo;database=Example" }

C#
using Soma.Core;

public class Config : MySqlConfig
{
    public override string ConnectionString { get { return "server=localhost;User Id=hoge;Password=foo;database=Example"; } }
}

前提として、次のような設定がmachine.configやapp.configなどの構成ファイルに記載されている必要があります。

xml
<configuration>
    <system.data>
        <DbProviderFactories>
            <add name="MySQL Data Provider" 
                invariant="MySql.Data.MySqlClient" 
                description=".Net Framework Data Provider for MySQL" 
                type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
        </DbProviderFactories>
    </system.data>
</configuration>

Oracle Database 11g の利用

Oracle Database 11gを利用するには、Soma.Core.OracleConfig の ConnectionString プロパティに接続文字列を指定します。(Oracle Database 11g を利用するには、Oracle Data Provider for .NET が別途必要です。)

F#
open Soma.Core

let config = 
  { new OracleConfig() with
    member this.ConnectionString = "DATA SOURCE=localhost;USER ID=SCOTT;PASSWORD=TIGER" }

C#
using Soma.Core;

public class Config : OracleConfig 
{
    public override string ConnectionString { get { return "DATA SOURCE=localhost;USER ID=SCOTT;PASSWORD=TIGER"; } }
}

前提として、次のような設定がmachine.configやapp.configなどの構成ファイルに記載されている必要があります。

xml
<configuration>
    <system.data>
        <DbProviderFactories>
            <add name="Oracle Data Provider for .NET" 
                invariant="Oracle.DataAccess.Client" 
                description="Oracle Data Provider for .NET" 
                type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
        </DbProviderFactories>
    </system.data>
</configuration>

SQLite 3 の利用

SQLite 3 を利用するには、Soma.Core.SQLiteConfig の ConnectionString プロパティに接続文字列を指定します。(SQLite 3 を利用するには、System.Data.SQLite が別途必要です。)

F#
open Soma.Core

let config = 
  { new SQLiteConfig() with
    member this.ConnectionString = "Data Source=..\..\Example.db" }

C#
using Soma.Core;

public class Config : SQLiteConfig 
{
    public override string ConnectionString { get { return "Data Source=..\..\Example.db"; } }
}

前提として、次のような設定がmachine.configやapp.configなどの構成ファイルに記載されている必要があります。

xml
<configuration>
    <system.data>
        <DbProviderFactories>
            <add name="SQLite Data Provider" 
                invariant="System.Data.SQLite" 
                description=".Net Framework Data Provider for SQLite" 
                type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
        </DbProviderFactories>
    </system.data>
</configuration>

SQLのログ出力

デフォルトでは、Somaによって実行されるSQLは、バインド変数が実際の値でフォーマットされてコンソールに出力されます。
これをカスタマイズするには、Soma.Core.IDbConfig インタフェースの Logger プロパティを実装します。
Logger プロパティへのパラメータであるSoma.Core.PreparedStatement は、ADO.NETデータプロバイダに渡されるバインド変数付きのSQL、バインド変数を実引数でフォーマットしたSQL、バインド変数のパラメータ(名前、型、実引数)といった情報を持っています。

以下にNLogを使用してパラメータつきのSQLを出力する例を示します。

F#
open System
open NLog
open Soma.Core

let config = 
  let logger = LogManager.GetLogger("config")
  let logAction = Action<PreparedStatement>(fun p -> logger.Info(p.Text))
  { new MsSqlConfig() with
    member this.ConnectionString = "Data Source=.;Initial Catalog=Example;Integrated Security=True" 
    member this.Logger = logAction }

C#
using System;
using NLog;
using Soma.Core;

public class Config : MsSqlConfig
{
    private static Logger logger = LogManager.GetLogger(typeof(Config));
    private static Action<PreparedStatement> logAction = p => logger.Info(p.Text);

    public override string ConnectionString { get { return "Data Source=.;Initial Catalog=Example;Integrated Security=True"; } }
    public override Action<PreparedStatement> Logger { get { return logAction; } }
}

ログ出力の抑制

SQLのログ出力を抑制するには、LoggerプロパティでSilentLoggerを返すようにオーバーライドします。
以下に例を示します。

F#
open System
open Soma.Core

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

C#
using System;
using NLog;
using Soma.Core;

public class Config : MsSqlConfig
{
    public override string ConnectionString { get { return "Data Source=.;Initial Catalog=Example;Integrated Security=True"; } }
    public override Action<PreparedStatement> Logger { get { return SilentLogger; } }
}

設定の利用例

設定の利用例を以下に示します。

F#
open Soma.Core

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

let dept = Db.find<Department> config [2]
...

C#
using Soma.Core;

public class Config : MsSqlConfig
{
    public override string ConnectionString { get { return "Data Source=.;Initial Catalog=Example;Integrated Security=True"; } }
}

public class Program
{
    public static void Main()
    {
      var db = new Db(new Config());
      var dept = db.Find<Department>(2);
      ...
    }
}

F#では、毎回第一引数にconfigインスタンスを渡すのは煩雑です。configインスタンスをラップした独自のモジュールやクラスを作成して使用することを推奨します。

F#
open Soma.Core

module MyDb = 
  let config = 
    { new MsSqlConfig() with
      member this.ConnectionString = "Data Source=.;Initial Catalog=Example;Integrated Security=True" }
  let find<'T when 'T : not struct> = Db.find<'T> config

let dept = MyDb.find<Department> [2]
...

Last edited May 14, 2011 at 11:16 PM by toshihiro, version 29

Comments

No comments yet.