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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top