2009年6月15日月曜日

System.Data.SqlClient.SqlCommandSet?

このエントリーをはてなブックマークに追加

Mono 2.4 + NHibernate 2.1.0 Alpha2 で SQL Server(2008 Express を使用)にアクセスする場合、NHibernate の SQL Server 用コンフィグファイルに、
<property name="adonet.batch_size">10</property>
という設定があると、次のような例外が発生してうまくいかない。
Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: type
  at System.Activator.CheckType (System.Type type) [0x00000]
  at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000]
  at NHibernate.AdoNet.SqlClientSqlCommandSet..ctor () [0x00000]
  at NHibernate.AdoNet.SqlClientBatchingBatcher..ctor (NHibernate.AdoNet.ConnectionManager connectionManager, IInterceptor interceptor) [0x00000]
...
原因は、NHibernate.AdoNet.SqlClientSqlCommandSet で
static SqlClientSqlCommandSet()
{
    Assembly sysData = Assembly.Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
    sqlCmdSetType = sysData.GetType("System.Data.SqlClient.SqlCommandSet");
    Debug.Assert(sqlCmdSetType != null, "Could not find SqlCommandSet!");
}
System.Data.SqlClient.SqlCommandSet の Type が取得ができず、null が返されるからだ。

Mono の System.Data(System.Data.dll)を調べてみたけど、System.Data.SqlClient 名前空間には SqlCommandSet クラスは存在しないようだ。また、MSDN では、SqlCommandSet に関する記述が見当たらなかった。

グーグル先生によれば、SQL Command の一括処理用のクラスらしいけど、もう使われていない、忘れられた子なのだろうか。うーむ、使われなくなった経緯が分からないが。

で、Mono 上での対応は、NHibernate の SQL Server 用コンフィグファイルにて、
<property name="adonet.batch_size">0</property>
とすることで、アクセスできるようになった。

0 件のコメント:

コメントを投稿