2010-04-15 6 views
1

J'ai deux requêtes SQL natives. Un pour Oracle et un pour MSSql. Je veux les faire passer par NHibernate. Comment puis-je savoir sur quel moteur Db je suis? Je sais que je peux ajouter dialect-scope dans les fichiers de mappage pour <database-object />. Y at-il quelque chose de similaire pour <sql-query />? Ou devrais-je mettre une if-loop dans mon code et essayer de comprendre le dialecte?NHibernate natif SQL et DialectScope

Merci.

+0

Juste pour vérifier: que fait votre requête SQL native? –

+0

J'essaie de comprendre la version de la base de données. Pour Oracle ce serait 'SELECT * FROM V $ VERSION' et pour MSSql je pourrais utiliser' @@ VERSION' – Lodewijk

Répondre

1

Cela n'allait jamais fonctionner: j'ai besoin d'analyser le résultat différemment selon la version de la base de données. Un if-else sur le dialecte est le chemin à parcourir ici.

Une autre option aurait été une procédure stockée. Ensuite, je pourrais utiliser database-object et en créer un pour chaque base de données. Mais je n'aime pas les procédures stockées :)

1

Vous pouvez convertir votre NHibernate.ISessionFactory en NHibernate.Impl.SessionFactoryImpl et interroger sa propriété Dialect, qui est un objet d'une classe dérivée de NHibernate.Dialect.Dialect (telle que MsSql2000Dialect ou Oracle8iDialect).

versions ultérieures d'une base de données (2000, 2005, 2008) sont mises en œuvre par les classes dérivées de la version précédente (utilisez l'Explorateur d'objets pour analyser NHibernate.dll)

+0

C'est ce que je fais maintenant, j'espérais qu'il y avait une solution plus élégante ... – Lodewijk

0

Si SQL est le même pour les deux requêtes, vous pouvez utiliser les interfaces ADO.NET à partir d'un ISession. Par exemple:

IDbConnection cxn = session.Connection; 
using (IDbCommand cmd = cxn.CreateCommand) 
{ 
    cmd.CommandText = "select * from schema.table"; 
    IDataReader rdr = cmd.ExecuteReader; 
} 

Vous pouvez ajouter des paramètres à l'aide cmd.CreateParameter.

Questions connexes