2009年6月15日月曜日

System.Data.SqlClient.SqlCommandSet?


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

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

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

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

0 件のコメント:

コメントを投稿