在nhibernate中執行SQL語句
在有些時候,可能需要直接執行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資料載入
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在事務中執行sql語句SQL
- 一條SQL語句在MySQL中如何執行的MySql
- 一條sql語句在mysql中是如何執行的MySql
- 一條 SQL 語句在 MySQL 中是如何執行的?MySql
- sql語句批量執行SQL
- SQL SERVER 中構建執行動態SQL語句SQLServer
- sql語句如何執行的SQL
- SQL語句執行順序SQL
- 執行大的sql語句SQL
- toad執行sql語句SQL
- SQL Server SQL語句執行順序SQLServer
- 怎樣在sqlite3上執行SQL語句SQLite
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- oracle rac中讓sql語句在指定的節點執行的方法OracleSQL
- 在ASP程式中執行SQL語句的安全性問題 (轉)SQL
- 利用pl/sql執行本地的sql檔案中的sql語句SQL
- 在函式中執行DDL語句失敗函式
- mysql執行sql語句過程MySql
- Mybatis 動態執行SQL語句MyBatisSQL
- mysql的sql語句執行流程MySql
- sql語句執行緩慢分析SQL
- SQL 語句的執行順序SQL
- 後臺執行SQL語句(oracle)SQLOracle
- Hibernate 執行原始SQL語句SQL
- Oracle SQL語句執行步驟OracleSQL
- SQL Server中SELECT語句執行順序解析SQLServer
- oracle 中如何顯示sql語句的執行時間和sql語句的執行後的當前時間OracleSQL
- 文章主題: 在Oracle中查詢剛才執行過的SQL語句OracleSQL
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 用LinqPad檢視Nhibernate生成的sql語句SQL
- 【Gp】PostgreSql中如何kill掉正在執行的sql語句SQL
- sql server中如何檢視執行效率不高的語句SQLServer
- Laravel 獲取執行的sql語句LaravelSQL
- MySQL cron定時執行SQL語句MySql
- 查詢執行慢的SQL語句SQL
- SQL語句執行過程詳解SQL
- CoreData執行過程的sql語句SQL