在nhibernate中執行SQL語句

ljm0211發表於2012-07-02
在有些時候,可能需要直接執行SQL語句、儲存過程等,但nhibernate並沒有提供一種讓我們執行SQL語句的方法,不過可以透過一些間接的方法來實現。

1. IDriver介面

IDriver介面就是資料訪問的驅動器,對於不同的資料提供者(SqlClient, OleDb等)就有不同的驅動器,與SqlClient對應的是SqlClientDriver, 而與OleDb對應的就是OleDbDriver。

IDriver介面用於取得連線物件,命令物件,並且格式化命令文字。

2. 取得資料庫連線物件

要執行SQL,必須取得IDbConnection物件,它可以透過會話工廠取得。要注意的是ISessionFactory介面並沒有提供與連線物件相關的操作,這些操作由ISessionFactoryImplementor介面定義。
ISessionFactoryImplementor繼承自ISessionFactory,而會話工廠的實現類SessionFactoryImpl實現了這兩個介面。

取得連線物件的程式碼如下:
ISessionFactoryImplementor factory = (ISessionFactoryImplementor)cfg.BuildSessionFactory();
IDbConnection conn = factory.OpenConnection();

OpenConnection方法從連線提供者ConnectionProvider取得IDbConnection物件,而連線提供者透過Driver物件建立IDbConnection。

3. 取得IDbCommand物件

在nhibernate內部,資料操作都是透過IDbCommand物件完成的,使用Command物件可以防止注入式攻擊和處理一些特殊字元。

取得IDbCommand物件的程式碼下:
IDbCommand cmd = factory.ConnectionProvider.Driver.CreateCommand();

可能有人會問,直接new SqlCommand()不就可以啦(如果使用SqlClient的話裡有話),幹嗎這麼複雜?
沒錯,這樣確實是可以的,nhibernate內部也是這樣做的。但如果我們直接這樣做的話,那程式碼就沒有很好的移植性,如果改變資料庫連線方式,那麼就需要更改程式碼了,而使用上面的程式碼則不需求更改任何程式碼。當然,SQL語句除外。
至於引數,透過IDbCommand.CreateParameter就可以處理了,這裡就不多說了。

4. 示例

下面給出一個在nhibernate中執行SQL語句的方法ExecuteSQL。
public IList ExecuteSQL( string query ) {
   IList result = new ArrayList();

   ISessionFactoryImplementor s = (ISessionFactoryImplementor)cfg.BuildSessionFactory();
   IDbCommand cmd = s.ConnectionProvider.Driver.CreateCommand();
   cmd.CommandText = query;

   IDbConnection conn = s.OpenConnection();
   try {
      cmd.Connection = conn;
      IDataReader rs = cmd.ExecuteReader();

      while ( rs.Read() ) {
         int fieldCount = rs.FieldCount;
         object[] values = new Object[ fieldCount ];
         for ( int i = 0; i < fieldCount; i ++ )
            values[i] = rs.GetValue(i);
         result.Add( values );
      }
   }
   finally {
      s.CloseConnection(conn);
   }

   return result;
}
返回結果與nhibernate的query的結果儲存一致(返回object[]的情況)。

作者Blog:http://blog.csdn.net/billy_zh/相關文章 使用Gentle做資料層的業務層原始碼 Gentle架構UML圖 NHibernate原始碼分析之三(續):資料持久化 nhibernate原始碼分析之八: 解析HQL nhibernate原始碼分析之七: HQL資料載入

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-734395/,如需轉載,請註明出處,否則將追究法律責任。

相關文章