我有兩個原生的SQL查詢。一個用於Oracle,一個用於MSSql。我想通過NHibernate運行它們。如何找出我正在使用的Db引擎?我知道我可以在<database-object />
的映射文件中添加方言範圍。有沒有類似的<sql-query />
?或者我應該在我的代碼中添加一個if循環並試圖找出方言?NHibernate Native SQL和DialectScope
謝謝。
我有兩個原生的SQL查詢。一個用於Oracle,一個用於MSSql。我想通過NHibernate運行它們。如何找出我正在使用的Db引擎?我知道我可以在<database-object />
的映射文件中添加方言範圍。有沒有類似的<sql-query />
?或者我應該在我的代碼中添加一個if循環並試圖找出方言?NHibernate Native SQL和DialectScope
謝謝。
這是永遠不會工作的:我需要根據數據庫的版本以不同的方式解析結果。方言中的if-else是去這裏的路。
另一種選擇是存儲過程。然後我可以使用database-object
併爲每個數據庫創建一個。但我不喜歡存儲過程:)
您可以將您的NHibernate.ISessionFactory強制轉換爲NHibernate.Impl.SessionFactoryImpl並查詢其Dialect屬性,該屬性是從NHibernate.Dialect.Dialect派生的類的對象(如MsSql2000Dialect或Oracle8iDialect)。
數據庫(2000年,2005年,2008年)的後續版本由以前版本的派生類中實現(使用對象瀏覽器來分析NHibernate.dll)
這就是我現在正在做的,我希望有一個更優雅的解決方案...... – Lodewijk 2010-04-15 15:06:41
如果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
添加參數。
只是爲了檢查:你的本機SQL查詢是幹什麼的? – 2010-04-15 15:03:16
我想弄清楚數據庫的版本。對於Oracle將是'SELECT * FROM V $ VERSION'和MSSql我可以使用'@@ VERSION' – Lodewijk 2010-04-19 07:05:37