2016-05-27 10 views
1

Ich habe eine Tabelle in einer Datenbank und eine der Spalten enthält XML als nvarchar gespeichert. Ich muss eine Abfrage schreiben und Informationen basierend auf Daten erhalten, die in dieser Spalte gespeichert sind.NHibernate Query Parameter Parser löst einen Fehler auf '/ * [1]/@ type' Ausdruck

So landete ich die folgenden nativen SQL-Abfrage mit NHibernate zu schreiben up:

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) 

Und es wirft einen Fehler: -: Länge 'ArgumentOutOfRangeException' Länge nicht weniger als zero.Parameter Name sein kann.

Nach ein wenig Testen habe ich herausgefunden, dass NHibernate versucht, meine Abfrage zu analysieren und dass die '/*[1]/@type' Zeile wahrscheinlich die Ursache ist. (Dies ist eigentlich ein vereinfachtes Beispiel und alle anderen Bedingungen funktionieren gut, wenn ich diesen entferne).

Also, wie kann ich meine Abfrage entkommen/reparieren, damit es funktioniert?

Antwort

0

Ich denke, das liegt an dem "@" in der Abfrage.

Haben Sie bereits versucht, Parameter zu verwenden?

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

Nun, ich habe ziemlich viel Zeit mit diesem Problem verbracht. Am Ende hatte ich einen Fehler, bei dem die Funktion xml.value den Parameter nicht als ersten Wert akzeptierte und nur Zeichenfolgenliterale akzeptierte. Ich habe sogar den von NHibernate generierten Code in SQL Studio kopiert und versucht, es dort zum Laufen zu bringen. Die letzte semi-funktionierende Lösung war, wo ich sql.variable [] Wildcard verwendet habe und es gab mir keine Fehler, aber die Abfrage ergab falsche Ergebnisse (leere Abfrage). – 1620k

+0

Die einzige funktionierende Lösung, die NHibernate verwendet, bestand darin, eine dynamische SQL-Zeichenfolge zu erstellen und sie zusammen mit dem Befehl exec an sql zu übergeben. Aber wir hatten einige Bedenken bezüglich der dynamischen SQL-Performance unter hoher Last, so dass ich am Ende die zugrunde liegende Verbindung aus der NHibernate-Sitzung herausriß und meine Anweisung mit ADO.NET schrieb, wie mein Kollege vorgeschlagen hatte. Und es funktioniert einwandfrei. – 1620k

+0

Also funktioniert der Parameter, den ich vorschlage, nicht? –