您的位置:首页 > 数据库

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

2008-12-23 11:19 260 查看
在用ActiveRecord使用SQlite数据库时,发现它的翻页SlicedFindAll效率很低,没有使用SQLite的Limit参数,于是想到构造原生SQL。

 

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

using Castle.ActiveRecord;

...

// Expects a root type

ISession sess = ActiveRecordMediator.GetSessionFactoryHolder().

    CreateSession(typeof(ActiveRecordBase));

    

// Now you can use sess.DbConnection

ActiveRecordMediator.GetSessionFactoryHolder().ReleaseSession(sess);

项目中用到的namespace:

using System;

using System.Data;

using System.Collections;

using System.Collections.Generic;

using System.Text;

using Castle.ActiveRecord;

using Castle.ActiveRecord.Queries;

using NHibernate.Expression;

using Castle.ActiveRecord.Framework.Config;

using Castle.ActiveRecord.Framework;

using NHibernate;

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

 

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

 

public static DataTable GetTable(IDataReader _reader)

 {

  DataTable _table = _reader.GetSchemaTable();

  DataTable _dt = new DataTable();

  DataColumn _dc;

  DataRow _row;

  System.Collections.ArrayList _al = new System.Collections.ArrayList();

  for (int i = 0; i < _table.Rows.Count; i ++)

 {

  _dc = new DataColumn();

  if (! _dt.Columns.Contains(_table.Rows[i]["ColumnName"].ToString()))

 {

  _dc.ColumnName = _table.Rows[i]["ColumnName"].ToString();

  _dc.Unique = Convert.ToBoolean(_table.Rows[i]["IsUnique"]);

  _dc.AllowDBNull = Convert.ToBoolean(_table.Rows[i]["AllowDBNull"]);

  _dc.ReadOnly = Convert.ToBoolean(_table.Rows[i]["IsReadOnly"]);

  _al.Add(_dc.ColumnName);

  _dt.Columns.Add(_dc);

 }

 }

 while (_reader.Read())

 {

  _row = _dt.NewRow();

  for ( int i = 0; i < _al.Count; i++)

  {

   _row[((System.String) _al[i])] = _reader[(System.String) _al[i]];

  }

 _dt.Rows.Add(_row);

}

return _dt;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息