2010-02-26 4 views
3

Nhibernate은 순수한 SQL 만 생성해야하는데,이 SQL을 C 함수에 보내야합니다.DB에 연결하지 않고 NHibernate를 사용하는 방법이 있습니까?

+0

왜이 작업을 수행 하시겠습니까? –

+0

우리 회사에는 데이터베이스 액세스를위한 C 계층이 있습니다. 모든 개발자 (.NET, Java, Cobol 및 Delphi)는이 계층을 사용해야합니다. 지금은 DAL을 사용하고 있지만 NHibernate를 사용하고 싶습니다. –

+0

이 C 계층은 ADO.NET의 * 대신 * 사용됩니까? 또는 그것은 어디에 적합합니까? –

답변

3

사용자 정의 드라이버
NHibernate.Driver.IDriver을 구현하여 C 층을 호출하는 드라이버를 구축 할 수 있습니다.

SQLite 드라이버는 C 라이브러리이므로 시작하는 것이 좋습니다. IDriver는 SQLiteDriver와 거의 동일합니다. NHibernate source code이 유용 할 것이다.

또한 C 라이브러리에 대한 IDbConnection 래퍼가 필요합니다. SQLite 래퍼 중 csharp-sqlite이 가장 작은 소스를 가지고 있으므로 도움이 될 것입니다.

ODBC를
NHibenate 이미 ODBC 연결, NHibernate.Driver.OdbcDriver에 대한 드라이버를 가지고있다.

2

이 작업을 수행하는 간단한 방법은 없습니다. 이론적으로 NHibernate는 SQL을 전혀 생성 할 필요가 없다. 방금 방언이 일어나는 것입니다 (예를 들어, 텍스트 파일이 데이터 저장소로있을 수 있습니다). 인터페이스는 추상화 장벽을 깨기 때문에 SQL을 노출하지 않습니다.

그러나 show_sql 옵션을 사용하면 NHibernate가 SQL을 기록하므로이를 사용할 수 있습니다. 내가 생각할 수있는 유일한 방법은 더미 데이터베이스를 설정하고 그에 대한 NH 쿼리를 실행하는 것입니다. SQL을 캡처하여 변수에 저장하기 위해 사용자 정의 log4net appender를 빌드하십시오. 이제이를 쿼리와 연결할 수 있습니다. 그래서 당신은 다음과 같은 것을 가질 것입니다

RunQueryAndCaptureSql(session.CreateQuery("from Stuff s where s.Thing = 'dude'")); 

어떤 appender가 SQL을 추가하기를 기다리고 블록을 반환합니다. 지옥 같은 분별없는 당신은 스레딩 문제를 다루어야하지만 작동해야합니다.

솔직히 말해서, 아마 NH 소스를 해킹했을 것입니다.

관련 문제