2010-12-13 6 views
-1

Dies ist wahrscheinlich ziemlich einfach, aber ich kann nicht scheinen, eine vernünftige Erklärung in jeder Dokumentation zu finden.NHibernate ISQLQuery SetParameter Problem

Ich versuche, eine NHibernate.ISQLQLQuery zu verwenden und SetResultTransformer() zu verwenden, um eine benutzerdefinierte Ergebnismenge aus einer benutzerdefinierten SQL-Abfrage zurückzugeben. Wie so:

public virtual IList<T> GetSQLObject<T>(string sql, IDbParameter[] parameters = null) 
    { 
     ISQLQuery qry = _sess.CreateSQLQuery(sql); 

     qry.SetResultTransformer(Transformers.AliasToBean(typeof(T)));  

     if (parameters != null) { 
      foreach (IDbParameter parameter in parameters) { 
       qry.SetParameter(parameter.Name, parameter.Value); 
      } 
     } 

     return qry.List<T>(); 
    } 

Aus bei den Beispielen suchen, scheint es, dass in der SQL-Abfrage muss ich Parameter verwenden im Format : param1 statt @ param1 als würde ich in einem Standard-SQL-Abfrage. Wenn ich die letztere Syntax in der Abfrage verwende, gibt es einen Fehler bei qry.SetParameter().

Gibt es einen Grund, warum ISQLQuery/NHibernate sie in diesem Format benötigt und nicht mit der normalen Syntax funktioniert?

Antwort

3

SQL Server verwendet @param, aber nicht jede andere Datenbank. Zum Beispiel verwendet MySQL? Param

NHibernate können Sie 1 Datenbank-Implementierung für eine andere mit wenig bis keine Überarbeitung Ihrer DAL austauschen. Er legt die Parameter basierend auf der Datenbank fest, die Sie beim Einrichten der NH-Konfiguration konfiguriert haben.

Edit: Auch ich denke: param kam aus dem Ruhezustand wird bei Oracle gezielt, wenn es ursprünglich entwickelt wurde, da Oracle verwendet: param

+0

Großartig, das macht Sinn, danke! – Brett

0

Phil das „Warum“ beantwortet hat; vielleicht kann ich ein "wie" empfehlen; warum nicht einfach eine neue Erweiterungsmethode zum IDbParameter Typ hinzufügen (so etwas wie .GetNHibernateName()), die den Parameternamen mit dem "@" zurückgibt, ersetzt durch ein ":"; das sollte trivial sein zu implementieren.

+0

Können Sie diese Erweiterungsmethode näher erläutern? Da der Parametername, den wir übergeben, das Präfixzeichen ':' oder '@' nicht enthält, wie überschreiben wir dieses interne Präfixzeichen mit der Erweiterungsmethode? –