problema NHibernate ISQLQuery setParameter
-
09-10-2019 - |
Domanda
Questo è probabilmente abbastanza semplice, ma io non riesco a trovare una spiegazione ragionevole in qualsiasi documentazione.
Sto cercando di utilizzare un NHibernate.ISQLQuery e utilizzando SetResultTransformer () per restituire un set personalizzato di risultati di una query SQL personalizzata. In questo modo:
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>();
}
Da guardando gli esempi, sembra che nella query SQL devo usare i parametri nel formato : param1 al posto di @ param1 come farei in uno standard query SQL. Se io uso la seconda sintassi nella query, si genera un errore a qry.SetParameter ().
C'è un motivo per cui ISQLQuery / NHibernate li richiede in questo formato e non funzionerà con la sintassi normale?
Soluzione
SQL Server utilizza @param, ma non ogni altro database fa. Ad esempio, utilizza MySQL? Param
NHibernate permette di scambiare 1 implementazione del database per un altro con poca o nessuna rielaborazione del vostro DAL. Si imposta i parametri in base alla banca dati è stata configurata quando si imposta la configurazione NH.
Edit: Anche io penso: param è nata da Hibernate preso di mira a Oracle quando è stato inizialmente sviluppato, dal momento che utilizzi Oracle: param
Altri suggerimenti
Phil ha risposto il "perché"; così forse posso consigliare un "come"; perché non basta aggiungere un nuovo metodo di estensione per il tipo IDbParameter
(qualcosa come .GetNHibernateName()
) che restituirà il nome del parametro con la "@" sostituito con un ":"; che dovrebbe essere banale da implementare.