nhibernate中执行SQL语句
Posted 技术社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nhibernate中执行SQL语句相关的知识,希望对你有一定的参考价值。
1 在有些时候,可能需要直接执行SQL语句、存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现。 2 3 下面给出一个在nhibernate中执行SQL语句的方法ExecuteSQL。 4 public IList ExecuteSQL( string query ) { 5 IList result = new ArrayList(); 6 7 ISessionFactoryImplementor s = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); 8 IDbCommand cmd = s.ConnectionProvider.Driver.CreateCommand(); 9 cmd.CommandText = query; 10 11 IDbConnection conn = s.OpenConnection(); 12 try { 13 cmd.Connection = conn; 14 IDataReader rs = cmd.ExecuteReader(); 15 16 while ( rs.Read() ) { 17 int fieldCount = rs.FieldCount; 18 object[] values = new Object[ fieldCount ]; 19 for ( int i = 0; i < fieldCount; i ++ ) 20 values[i] = rs.GetValue(i); 21 result.Add( values ); 22 } 23 } 24 finally { 25 s.CloseConnection(conn); 26 } 27 28 return result; 29 } 30 31 返回结果与nhibernate的query的结果保存一致(返回object[]的情况)。 32 33 1. IDriver接口 34 35 IDriver接口就是数据访问的驱动器,对于不同的数据提供者(SqlClient, OleDb等)就有不同的驱动器,与SqlClient对应的是SqlClientDriver, 而与OleDb对应的就是OleDbDriver。 36 37 IDriver接口用于取得连接对象,命令对象,并且格式化命令文本。 38 39 2. 取得数据库连接对象 40 41 要执行SQL,必须取得IDbConnection对象,它可以通过会话工厂取得。要注意的是ISessionFactory接口并没有提供与连接对象相关的操作,这些操作由ISessionFactoryImplementor接口定义。 42 ISessionFactoryImplementor继承自ISessionFactory,而会话工厂的实现类SessionFactoryImpl实现了这两个接口。 43 44 取得连接对象的代码如下: 45 ISessionFactoryImplementor factory = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); 46 IDbConnection conn = factory.OpenConnection(); 47 48 OpenConnection方法从连接提供者ConnectionProvider取得IDbConnection对象,而连接提供者通过Driver对象创建IDbConnection。 49 50 3. 取得IDbCommand对象 51 52 在nhibernate内部,数据操作都是通过IDbCommand对象完成的,使用Command对象可以防止注入式攻击和处理一些特殊字符。 53 54 取得IDbCommand对象的代码下: 55 IDbCommand cmd = factory.ConnectionProvider.Driver.CreateCommand(); 56 57 可能有人会问,直接new SqlCommand()不就可以啦(如果使用SqlClient的话里有话),干吗这么复杂? 58 没错,这样确实是可以的,nhibernate内部也是这样做的。但如果我们直接这样做的话,那代码就没有很好的移植性,如果改变数据库连接方式,那么就需要更改代码了,而使用上面的代码则不需求更改任何代码。当然,SQL语句除外。 59 至于参数,通过IDbCommand.CreateParameter就可以处理了
以上是关于nhibernate中执行SQL语句的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate Race Condition在一个事务中的两个语句上
我怎样才能让 NHibernate 只生成 SQL 而不执行它?