在nhibernate中执行SQL语句和存储过程

来源:互联网 发布:面膜知乎 编辑:程序博客网 时间:2024/06/09 19:37

在有些时候,可能需要直接执行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;
}

执行存储过程的方法.
public IList ExecuteStoredProc( string spName, ICollection paramInfos ) {
   IList result = new ArrayList();

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

   cmd.CommandText = spName;
   cmd.CommandType = CommandType.StoredProcedure;

   // 加入参数
   if ( paramInfos != null ) {
      foreach( ParamInfo info in paramInfos ) {
         IDbDataParameter parameter = cmd.CreateParameter();
         parameter.ParameterName = info.name; // driver.FormatNameForSql( info.Name );
         parameter.Value = info.Value;
         cmd.Parameters.Add( parameter );
      }
   }

   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;
}

其中ParamInfo为存储参数信息的结构, 定义如下:
 public struct ParamInfo {
    public string Name;
    public object Value;
 }

返回结果与nhibernate的query的结果保存一致(返回object[]的情况)。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kybd2006/archive/2007/10/24/1841782.aspx

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 无塔供水压力小怎么办 家用增压水塔压力不稳定怎么办 蝴蝶耳堵比较紧怎么办 跑步机踏板坏了怎么办 遥控器电池没电了怎么办 空调遥控器电池没电了怎么办 想要自慰家里没有情趣用品怎么办 对政协提案的答复有意见怎么办 邻居在自建房养殖鳖怎么办 江桥全民健身卡怎么办 南翔全民健身卡怎么办 椭圆机皮带断了怎么办 不小心扭腰了怎么办 扭腰之后腿疼怎么办 扭腰怎么办吃什么补 湖州奥体中心怎么办卡 学车把教练投诉了怎么办 白球鞋鞋边发黄怎么办 公务员体检时心跳过快怎么办 老人心脏跳得慢怎么办 银行月限额10万怎么办 跑步后迎面骨疼怎么办 跑步时迎面骨疼怎么办 爬了楼梯小腿疼怎么办 走路走太多小腿酸痛怎么办 微信转账月限额怎么办 运动后小腿骨疼怎么办 用单杠练腹肌晃怎么办 一跑步小腿就紧怎么办 小腿一跑步就痛怎么办 单杠屈臂悬垂身体摆动怎么办 脸上被打了紫了怎么办 王者荣耀队友太坑怎么办 大脸不想戴泳帽怎么办 脐带掉了有血怎么办 颈椎不小心扭了怎么办 遇不到合适的人怎么办 老爸不爱吃饭身体不好怎么办 小朋友在日本旅游生病怎么办 小朋友不吃饭装生病怎么办 带小朋友去苏梅岛生病了怎么办