使用DATAREADER 和控件进行分页
分成两部分,一部分对每页多少条数据、当前页等进行控制,另一部分对数据进行访问使用DATAREADER 进行访问,需要的数据,有多少件就进行返回多少数据
特点就是速度快,但是需要每次从数据库读取数据,不能做CACHE,这也无关紧要,我测试从一个20000条的数据表读,用网上流传的那个用DATATABLE进行分页的控件,一运行我的电脑IIS就死,也许电脑有点差。只好每次选取5000行,进行分页大概查询到每页大概要2秒多,使用此控件读取第一页大概是0。0几秒,最后一页为0。8-1秒左右。
另外一个麻烦的就是要写两部分要统计所有数,不过统计数据访问可以写在基类中
取多少页码的做成了控件,代码比较多,就不贴了,有兴趣的朋友可以下载完整的例子
![]()
![]()
public static DataTable paging(IDataReader dataReader, int PageSize, int curPage)
![]()
{
DataTable dt;
dt = new DataTable();
int colCount = dataReader.FieldCount;
for (int i = 0; i < colCount; i++)
![]()
{
dt.Columns.Add(new DataColumn(dataReader.GetName(i), dataReader.GetFieldType(i)));
}
// 读取数据。将DataReader中的数据读取到DataTable中
object[] vald = new object[colCount];
int iCount = 0; // 临时记录变量
while (dataReader.Read())
![]()
{
// 当前记录在当前页记录范围内
if (iCount >= PageSize*(curPage - 1) && iCount < PageSize*curPage)
![]()
{
for (int i = 0; i < colCount; i++)
vald[i] = dataReader.GetValue(i);
![]()
dt.Rows.Add(vald);
}
else if (iCount > PageSize*curPage)
![]()
{
break;
}
iCount++; // 临时记录变量递增
}
if (!dataReader.IsClosed)
![]()
{
dataReader.Close();
dataReader.Dispose();
}
return dt;
}
![]()
![]()
public static void ExecuteQuery(OracleConnection conn, OracleParameter[] oracleParms, string reportCode, int PageSize, int curPage, out int recCount, out DataTable dt)
![]()
{
string strCount="select count(*) "+reportCode.Substring(reportCode.ToLower().IndexOf("from"));
object o = OracleHelper.ExecuteScalar(conn, strCount, oracleParms);
string oName = o.ToString();
recCount = Convert.ToInt32(oName);
IDataReader dataReader = OracleHelper.ExecuteReader(conn, reportCode, oracleParms);
dt = paging(dataReader, PageSize, curPage);
}
你可以在这里下载完整例子