2010-04-15 3 views
1

두 개의 네이티브 SQL 쿼리가 있습니다. 하나는 Oracle 용이고 다른 하나는 MSSql 용입니다. 나는 NHibernate를 통해 그것들을 돌리고 싶다. Db 엔진이 무엇인지 어떻게 알 수 있습니까? <database-object />에 대한 매핑 파일에 dialect-scope을 추가 할 수 있다는 것을 알고 있습니다. <sql-query />과 비슷한 것이 있습니까? 아니면 내 코드에 if-loop를 넣고 방언을 알아 내야합니까?NHibernate 네이티브 SQL과 DialectScope

감사합니다.

+0

그냥 확인 : 네이티브 SQL 쿼리는 무엇을하고 있습니까? –

+0

데이터베이스의 버전을 파악하려고합니다. 오라클의 경우 SELECT * FROM V $ VERSION'이고 MSSql의 경우'@@ VERSION'을 사용할 수 있습니다 – Lodewijk

답변

1

이것은 결코 작동하지 않을 것입니다. 결과를 데이터베이스의 버전에 따라 다르게 구문 분석해야합니다. 방언의 if-else가 여기로가는 길입니다.

다른 옵션 중 하나는 저장 프로 시저였습니다. 그런 다음 database-object을 사용하여 각 데이터베이스에 대해 하나를 만들 수 있습니다. 하지만 저장 프로 시저가 마음에 들지 않습니다.

1

NHibernate.ISessionFactory를 NHibernate.Impl.SessionFactoryImpl로 캐스팅하고 NHibernate.Dialect.Dialect (예 : MsSql2000Dialect 또는 Oracle8iDialect)에서 파생 된 클래스의 객체 인 Dialect 속성을 쿼리 할 수 ​​있습니다. 데이터베이스 (2000, 2005, 2008)의

후속 버전의 SQL 모두 쿼리에 대해 동일한 경우

+0

그게 제가 지금하고있는 일입니다. 좀 더 우아한 해결책이 있기를 바랐습니다 ... – Lodewijk

0

을 (NHibernate.dll를 분석하기 위해 개체 브라우저를 사용) 이전 버전에서 파생 된 클래스에 의해 구현된다 당신은 ISession에서 ADO.NET 인터페이스를 사용할 수 있습니다. 예 :

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

cmd.CreateParameter을 사용하여 매개 변수를 추가 할 수 있습니다.