高效分页中因DataTable在几百万数据时速度太慢现在想换成SqlDataReader,出了点小问题请高手帮忙看看

flyso 2012-05-17 07:30:35
高效分页中因DataTable在几百万数据时速度太慢现在想换成SqlDataReader,出了点小问题请高手帮忙看看

之前用的是DataTable,开始还好好的,现在数据达到几百万后,点开页面超级慢,现在想换成DataReader的方法。
-----------------------------------------------
出现错误如下:
'flyso_listpage' 附近有语法错误。
-----------------------------------------------
//SQL助手类
SqlHelper.cs
 public static SqlDataReader dataReader(string storedProcName, SqlParameter[] pars)
{
SqlCommand command = null;
//using (SqlConnection connection = new SqlConnection(ConnectionString))
SqlConnection connection = new SqlConnection(ConnectionString);
{
connection.Open();
command = new SqlCommand(storedProcName, connection);
if (pars != null)
{
command.Parameters.AddRange(pars);
}
}
return command.ExecuteReader(CommandBehavior.CloseConnection);
}


//数据层
//翻页列表
listpage_DAL.cs
        public SqlDataReader 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.dataReader("flyso_listpage",pars);
}


页面层:
listpage.aspx
.
.
.
.
Pager.RecordCount = new FlysoPager_DAL().TotalRecord(Pager);
list.DataSource = new FlysoPager_DAL().Pagerlist(Pager);
list.DataBind();


请高手帮忙看一下
...全文
325 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyso 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
主要是在SQL里面的优化,层多慢是肯定的,直接访问数据库是最快的
[/Quote]

问题解决了,把AWE打开了就快了,200毫秒了
dalmeeme 2012-05-17
  • 打赏
  • 举报
回复
用max分页法,效率非常高,网上搜索下。
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
主要是在SQL里面的优化,层多慢是肯定的,直接访问数据库是最快的
flyso 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

command.CommandType = CommandType.StoredProcedure; 没写啊
[/Quote]

感谢,问题解决了,晕,忽略了最基本的问题

效率还是没有多少提升,难道三层架构比非三层架构要慢? 同样的存储过程,之前100多万数据,只要100毫秒左右,现在这个要几秒
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
速度慢跟这没多大关系,你可以试试
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
你只需该
try
{
conn.Open();
SqlCommand cmd = new SqlCommand("flyso_listpage", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(pars);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);

}

你少内容了啊
flyso 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

可以参考一下http://www.cnblogs.com/lzhdim/archive/2009/01/05/1368817.html


用的是存储过程啊,存储过程是没有问题的,用了几年了,之前用DataTable,现在改成DataReader的方式才出的问题
[/Quote]

没改之前
//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);
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
command.CommandType = CommandType.StoredProcedure; 没写啊
flyso 2012-05-17
  • 打赏
  • 举报
回复
存储过程之前也用过百万级的,效率也很高,当时没有用三层架构(直接用的list.DataSource = mySqlCommand.ExecuteReader();),换成三层架构之后就用DataTable了,发现达到百万级之后就变得超级慢,现在想换成SqlDataReader发现有问题,不会用三层架构的SqlDataReader里的用法
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
DataReader
DataTable
调用的时候传参数都是一样的,没什么差别的

如果你的Pager内容是正确的,就没有问题

另外,对照下原先好用的代码处

Pagerlist(FlysoPager Pager)函数里面的代码是不是拼写错了或者顺序是否相同
flyso 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

可以参考一下http://www.cnblogs.com/lzhdim/archive/2009/01/05/1368817.html
[/Quote]

用的是存储过程啊,存储过程是没有问题的,用了几年了,之前用DataTable,现在改成DataReader的方式才出的问题
EnForGrass 2012-05-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
高效分页中因DataTable在几百万数据时速度太慢现在想换成SqlDataReader,出了点小问题请高手帮忙看看

之前用的是DataTable,开始还好好的,现在数据达到几百万后,点开页面超级慢,现在想换成DataReader的方法。
-----------------------------------------------
出现错误如下:
'flyso_listpage' 附……
[/Quote]
LZ是用的存储过程分页,应该是存储过程flyso_listpage有问题。贴一下
dalmeeme 2012-05-17
  • 打赏
  • 举报
回复
大数据分页的关键,在于用SQL分页或存储过程分页,而不是选择DataTable还是DataReader。
孟子E章 2012-05-17
  • 打赏
  • 举报
回复
几百万数据也不是都放在DataTable里面的,你应该采用存储过程进行分页,只返回当前页 的数据,采用DataTable、SqlDataReader应该都差不多的

62,267

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧