zoukankan      html  css  js  c++  java
  • 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就可以处理了
  • 相关阅读:
    备忘录
    中缀表达式转为后缀表达式
    未出现的最小正整数
    摩尔投票算法
    两个等长升序序列找中位数
    Morris二叉树遍历
    2020牛客寒假算法基础集训营5 街机争霸
    2020牛客寒假算法基础集训营5 牛牛战队的比赛地
    2020牛客寒假算法基础集训营2 求函数
    2020牛客寒假算法基础集训营2 建通道
  • 原文地址:https://www.cnblogs.com/dqh123/p/9470187.html
Copyright © 2011-2022 走看看