2016-05-27 1 views
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'行が原因である可能性があります。 (これは実際には単純化された例で、これを削除すると他の条件はうまく動作します)

それで、私のクエリをエスケープして修正するにはどうすればよいですか?

答えて

0

これは、クエリの「@」のためだと思います。

既にパラメータを使用してみましたか?

string sql = @"SELECT a.id as s 
    FROM [DBT].[dbo].[tb_myTable] a 
    where (cast (a.vchExtendedInfo as XML)).value(:type,'NVARCHAR(MAX)')=:value" 
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession() 
    .CreateSQLQuery(sql) 
    .SetAnsiString("type", "/*[1]/@type") 
    .SetAnsiString("value", "deal"); 
+0

私はこの問題にかなりの時間を費やしました。私は、xml.value関数が最初の値としてパラメータを受け入れることを拒否し、受け入れられた文字列リテラルのみがエラーになることになりました。私はさらに、Hibernateで生成されたコードをSQL Studioにコピーして、そこで動作させようとしました。最後のセミワーキングソリューションは、私がsql.variable []ワイルドカードを使用した場所で、エラーを出すことはありませんでしたが、クエリが間違った結果(空のクエリ)を生成しました。 – 1620k

+0

NHibernateを使用している唯一の実用的な解決策は、動的SQL文字列を作成してexecコマンドとともにSQLに渡すことでした。しかし、私たちは重い負荷の下でダイナミックなSQLパフォーマンスに懸念を抱いていました。結局のところ、NHibernateセッションからの基本接続をリッピングして、同僚が提案したようにADO.NETを使用してステートメントを書きました。そしてそれは完璧に正常に動作します。 – 1620k

+0

私が提案するパラメータは機能しません。 –

関連する問題