2011-03-03 9 views
0

にはなりません。これは何か意味のある結果にはなりません。送信されたSQLは次のようになります。私は(ちょうどテストのために)そのように行うと{...} where [email protected];@p0 = 0x0001000000FFFFFFFF010000000000000004010000000C53797374656D2E496E74333201000000076D5F76616C75650008010000000BsetParameterをは意味のあるクエリ

(@ P0は意味のある何かを宣言されていない):

hibQuery.SetParameter<int>("UserId", (int)intObject); 

期待通りの結果がうまく次のようになります。 {...}where [email protected];@p0 = 1

私はここで間違っていますか? sl3dg3

答えて

1

投稿したコードに間違いはありません。私が考えることができるのは、intObjectは実際にはInt32ではない(実際にはInt64またはInt16、さらにはDecimalで、ジェネリックバージョンのキャストは問題を隠すかもしれない)、またはInt32にInt32にキャストせずにInt32としてシリアライズすると、何らかの奇妙な動作が発生します。タイプが実際のパラメータのタイプと一致するかどうかを再確認します。

本当にオブジェクトの型が正しく、動的型指定が必要な場合は、NHibernateに渡された値の型を "推測"させるようにしてください。ランタイムはオブジェクトの実際の型を常に知っていなければならないので、NHはIType(間違っている可能性があります)を指定しなくてもこれを検出できます。タイプが正しいことが分かっている場合は、テストで正常なジェネリックメソッドを呼び出すこともできます。

var setParamMethod = hibQuery.GetType().GetMethod("SetParameter`1"); 
setParamMethod.MakeGenericMethod(myValueType) 
    .Invoke(nhibQuery, new object[]{"UserId", intObject}); 
+0

種類を、私はダブルとトリプルチェックし、彼らは同じです。また何か間違っているはずだと思ったが、何も見つけられなかった。基本的に 'hibQuery.SetParameter(" UserId "、intObject);'型情報なしで単に呼び出すことを提案していますか?さて、この単純化されたソリューションにコードを変更したところ、これまでのところうまくいくようです... – sl3dg3

0

なぜタイプを明示的に指定していますか?

これは、同じようにうまくいくはずです:それは奇妙だ

.SetParameter("UserId", intObject) 
+0

NHibernateが正しいタイプで内部的に動作するようにしたかっただけです。しかし、実際に型を明示的に定義する必要はないかもしれません... – sl3dg3

+0

@ sl3dg3:間違っている場合は、デフォルトをオーバーライドするだけです。 –