高效分页中因DataTable在几百万数据时速度太慢现在想换成SqlDataReader,出了点小问题请高手帮忙看看 本帖最后由 flyso 于 2012-05-17 19:36:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 几百万数据也不是都放在DataTable里面的,你应该采用存储过程进行分页,只返回当前页 的数据,采用DataTable、SqlDataReader应该都差不多的 大数据分页的关键,在于用SQL分页或存储过程分页,而不是选择DataTable还是DataReader。 可以参考一下http://www.cnblogs.com/lzhdim/archive/2009/01/05/1368817.html LZ是用的存储过程分页,应该是存储过程flyso_listpage有问题。贴一下 用的是存储过程啊,存储过程是没有问题的,用了几年了,之前用DataTable,现在改成DataReader的方式才出的问题 DataReader DataTable调用的时候传参数都是一样的,没什么差别的如果你的Pager内容是正确的,就没有问题另外,对照下原先好用的代码处Pagerlist(FlysoPager Pager)函数里面的代码是不是拼写错了或者顺序是否相同 存储过程之前也用过百万级的,效率也很高,当时没有用三层架构(直接用的list.DataSource = mySqlCommand.ExecuteReader();),换成三层架构之后就用DataTable了,发现达到百万级之后就变得超级慢,现在想换成SqlDataReader发现有问题,不会用三层架构的SqlDataReader里的用法 command.CommandType = CommandType.StoredProcedure; 没写啊 没改之前//SQL助手类public static DataTable ExecuteDataTableList(SqlParameter[] pars) { using (SqlConnection conn = new SqlConnection(ConnectionString)) try { conn.Open(); SqlCommand cmd = new SqlCommand("flyso_listpage", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddRange(pars); SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dataTable = new DataTable(); adapter.Fill(dataTable); return dataTable; } catch (Exception) { throw; } finally { conn.Close(); }//数据层 //翻页列表 public DataTable Pagerlist(FlysoPager Pager) { SqlParameter[] pars = new SqlParameter[9]; pars[0] = new SqlParameter("@sTable", SqlDbType.VarChar, 30); pars[0].Value = Pager.tablename; pars[1] = new SqlParameter("@sField", SqlDbType.VarChar, 200); pars[1].Value = Pager.Fields; pars[2] = new SqlParameter("@sCondition", SqlDbType.VarChar, 500); pars[2].Value = Pager.Condition; pars[3] = new SqlParameter("@sPkey", SqlDbType.VarChar, 150); pars[3].Value = Pager.MKey; pars[4] = new SqlParameter("@sOrder", SqlDbType.VarChar, 50); pars[4].Value = Pager.Order; pars[5] = new SqlParameter("@iPageCurr", SqlDbType.Int); pars[5].Value = Pager.intPageNo; pars[6] = new SqlParameter("@iPageSize", SqlDbType.Int); pars[6].Value = Pager.intPageSize; pars[7] = new SqlParameter("@iRecordCount", SqlDbType.Int); pars[7].Value = Pager.RecordCount; pars[8] = new SqlParameter("RowCount", SqlDbType.Int); pars[8].Direction = ParameterDirection.ReturnValue; return SqlHelper.ExecuteDataTableList(pars); 本帖最后由 net_lover 于 2012-05-17 20:54:06 编辑 本帖最后由 net_lover 于 2012-05-17 21:04:34 编辑 用max分页法,效率非常高,网上搜索下。 问题解决了,把AWE打开了就快了,200毫秒了 ASP.NET中如何获取本机外网IP的所在地,网络类型(电信,网通等),再将信息写入图片中? 使用CodeSimth+NetTiers生成的底层,写入数据时出错 控件位置如何默认为:static 自己建的dataSet(就是数据集xsd文件),如何得到数据。 怎么做个防刷新记时器? 又来问个白痴问题,请问如何在程序中触发事件?解决了一定给分! 简单问题,急,再现等 关于删除文件的问题,请高手帮忙? 存储过程的输入输出问题 为什么我的asp.net textbox控件出错???? asp.net 在App_Code的类中,如何使用物理路径?? 关于Datagrid的下拉框项的问题
用的是存储过程啊,存储过程是没有问题的,用了几年了,之前用DataTable,现在改成DataReader的方式才出的问题
DataTable
调用的时候传参数都是一样的,没什么差别的如果你的Pager内容是正确的,就没有问题另外,对照下原先好用的代码处Pagerlist(FlysoPager Pager)函数里面的代码是不是拼写错了或者顺序是否相同
没改之前
//SQL助手类
public static DataTable ExecuteDataTableList(SqlParameter[] pars)
{
using (SqlConnection conn = new SqlConnection(ConnectionString)) try
{
conn.Open();
SqlCommand cmd = new SqlCommand("flyso_listpage", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(pars);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
return dataTable; }
catch (Exception)
{
throw;
}
finally
{
conn.Close();
}
//数据层
//翻页列表
public DataTable Pagerlist(FlysoPager Pager)
{
SqlParameter[] pars = new SqlParameter[9];
pars[0] = new SqlParameter("@sTable", SqlDbType.VarChar, 30);
pars[0].Value = Pager.tablename;
pars[1] = new SqlParameter("@sField", SqlDbType.VarChar, 200);
pars[1].Value = Pager.Fields;
pars[2] = new SqlParameter("@sCondition", SqlDbType.VarChar, 500);
pars[2].Value = Pager.Condition;
pars[3] = new SqlParameter("@sPkey", SqlDbType.VarChar, 150);
pars[3].Value = Pager.MKey;
pars[4] = new SqlParameter("@sOrder", SqlDbType.VarChar, 50);
pars[4].Value = Pager.Order;
pars[5] = new SqlParameter("@iPageCurr", SqlDbType.Int);
pars[5].Value = Pager.intPageNo;
pars[6] = new SqlParameter("@iPageSize", SqlDbType.Int);
pars[6].Value = Pager.intPageSize;
pars[7] = new SqlParameter("@iRecordCount", SqlDbType.Int);
pars[7].Value = Pager.RecordCount;
pars[8] = new SqlParameter("RowCount", SqlDbType.Int);
pars[8].Direction = ParameterDirection.ReturnValue;
return SqlHelper.ExecuteDataTableList(pars);
问题解决了,把AWE打开了就快了,200毫秒了