ActiveRecord 执行原生SQL语句及返回DataTable

在用ActiveRecord使用SQlite数据库时,发现它的翻页SlicedFindAll效率很低,没有使用SQLite的Limit参数,于是想到构造原生SQL。

 

在AR的官方网站上看到获取DBConnection的方法:

  1. using Castle.ActiveRecord;
  2. ...
  3. // Expects a root type
  4. ISession sess = ActiveRecordMediator.GetSessionFactoryHolder().
  5.     CreateSession(typeof(ActiveRecordBase));
  6.     
  7. // Now you can use sess.DbConnection
  8. ActiveRecordMediator.GetSessionFactoryHolder().ReleaseSession(sess);

项目中用到的namespace:

  1. using System;
  2. using System.Data;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using Castle.ActiveRecord;
  7. using Castle.ActiveRecord.Queries;
  8. using NHibernate.Expression;
  9. using Castle.ActiveRecord.Framework.Config;
  10. using Castle.ActiveRecord.Framework;
  11. using NHibernate;

得到DbConnection后,可以调用Command了,但是对于组件绑定的状况,一般需要返回DataTable。

 

于是使用一下DataReader填充DataTable的方法,主要思路是根据DataReader的SchemaTable构造DataTable。

 

  1. public static DataTable GetTable(IDataReader _reader)
  2.  {
  3.   DataTable _table = _reader.GetSchemaTable();
  4.   DataTable _dt = new DataTable();
  5.   DataColumn _dc;
  6.   DataRow _row;
  7.   System.Collections.ArrayList _al = new System.Collections.ArrayList();
  8.   for (int i = 0; i < _table.Rows.Count; i ++)
  9.  {
  10.   _dc = new DataColumn();
  11.   if (! _dt.Columns.Contains(_table.Rows[i]["ColumnName"].ToString()))
  12.  {
  13.   _dc.ColumnName = _table.Rows[i]["ColumnName"].ToString();
  14.   _dc.Unique = Convert.ToBoolean(_table.Rows[i]["IsUnique"]);
  15.   _dc.AllowDBNull = Convert.ToBoolean(_table.Rows[i]["AllowDBNull"]);
  16.   _dc.ReadOnly = Convert.ToBoolean(_table.Rows[i]["IsReadOnly"]);
  17.   _al.Add(_dc.ColumnName);
  18.   _dt.Columns.Add(_dc);
  19.  }
  20.  }
  21.  while (_reader.Read())
  22.  {
  23.   _row = _dt.NewRow();
  24.   for ( int i = 0; i < _al.Count; i++)
  25.   {
  26.    _row[((System.String) _al[i])] = _reader[(System.String) _al[i]];
  27.   }
  28.  _dt.Rows.Add(_row);
  29. }
  30. return _dt;
  31. }

你可能感兴趣的:(sql,数据库,sqlite,command,table,ActiveRecord)