1
データベースにテーブルがあり、カラムの1つにnvarcharとして格納されているxmlが含まれています。私は、クエリを記述し、その列に格納されたデータに基づいて情報を取得する必要があります。NHibernateクエリパラメータパーサーは、 '/ * [1]/@ type'式でエラーをスローします。
だから私はNHibernateはを使用して、次のネイティブSQLクエリ書いてしまった:
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value('/*[1]/@type','NVARCHAR(MAX)')='deal'"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession().CreateSQLQuery(sql)
をそして、それはエラーがスローされます:「例外ArgumentOutOfRangeException」 - 長さがzero.Parameter名より小さくすることはできません:長さ。
ちょっと試してみたところ、NHibernateがクエリを解析しようとしていて、'/*[1]/@type'
行が原因である可能性があります。 (これは実際には単純化された例で、これを削除すると他の条件はうまく動作します)
それで、私のクエリをエスケープして修正するにはどうすればよいですか?
私はこの問題にかなりの時間を費やしました。私は、xml.value関数が最初の値としてパラメータを受け入れることを拒否し、受け入れられた文字列リテラルのみがエラーになることになりました。私はさらに、Hibernateで生成されたコードをSQL Studioにコピーして、そこで動作させようとしました。最後のセミワーキングソリューションは、私がsql.variable []ワイルドカードを使用した場所で、エラーを出すことはありませんでしたが、クエリが間違った結果(空のクエリ)を生成しました。 – 1620k
NHibernateを使用している唯一の実用的な解決策は、動的SQL文字列を作成してexecコマンドとともにSQLに渡すことでした。しかし、私たちは重い負荷の下でダイナミックなSQLパフォーマンスに懸念を抱いていました。結局のところ、NHibernateセッションからの基本接続をリッピングして、同僚が提案したようにADO.NETを使用してステートメントを書きました。そしてそれは完璧に正常に動作します。 – 1620k
私が提案するパラメータは機能しません。 –