2010-04-15 41 views
1

我有兩個原生的SQL查詢。一個用於Oracle,一個用於MSSql。我想通過NHibernate運行它們。如何找出我正在使用的Db引擎?我知道我可以在<database-object />的映射文件中添加方言範圍。有沒有類似的<sql-query />?或者我應該在我的代碼中添加一個if循環並試圖找出方言?NHibernate Native SQL和DialectScope

謝謝。

+0

只是爲了檢查:你的本機SQL查詢是幹什麼的? – 2010-04-15 15:03:16

+0

我想弄清楚數據庫的版本。對於Oracle將是'SELECT * FROM V $ VERSION'和MSSql我可以使用'@@ VERSION' – Lodewijk 2010-04-19 07:05:37

回答

1

這是永遠不會工作的:我需要根據數據庫的版本以不同的方式解析結果。方言中的if-else是去這裏的路。

另一種選擇是存儲過程。然後我可以使用database-object併爲每個數據庫創建一個。但我不喜歡存儲過程:)

1

您可以將您的NHibernate.ISessionFactory強制轉換爲NHibernate.Impl.SessionFactoryImpl並查詢其Dialect屬性,該屬性是從NHibernate.Dialect.Dialect派生的類的對象(如MsSql2000Dialect或Oracle8iDialect)。

數據庫(2000年,2005年,2008年)的後續版本由以前版本的派生類中實現(使用對象瀏覽器來分析NHibernate.dll)

+0

這就是我現在正在做的,我希望有一個更優雅的解決方案...... – Lodewijk 2010-04-15 15:06:41

0

如果SQL是兩個查詢相同,您可以使用來自ISession的ADO.NET接口。例如:

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

您可以使用cmd.CreateParameter添加參數。