类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:
想要查询100多万条记录,用DataGrid怎样做好分页呀,这里不能一次性把记录都取出来的,因为数据太多了。
高手帮忙呀!
网友回答:
最好是使用存储过程进行分页
到sql server版找找,肯定有。
这样不好吧,觉得太占内存了否则,缓存到硬盘上效率也不见得好。
存储过程.
也可用分页控件
AspNetPager
一个简单的存储过程,用的临时表法
CREATE PROCEDURE page_res
(
@targettable nvarchar(50), --目标表、视图..
@key nvarchar(50), --关键字段
@swhere nvarchar(4000), --查询条件
@pageSize int, --每页显示记录条数
@pageIndex int, --要显示第几页
@allnum int output
)
AS
set nocount on
begin
create table #t(id int identity(1,1),username nvarchar)
declare @PageLowerBound int
declare @PageUpperBound int
declare @table nvarchar(4000)
--declare @spnum int
set @table=Nselect @num=count(*) from +@targettable +@swhere
exec sp_executesql @table,
N@num int output,
@allnum output
set @PageLowerBound=(@pageIndex-1)*@pageSize
set @PageUpperBound=@PageLowerBound+@pageSize
set rowcount @PageUpperBound
set @table=Ninsert into #t(username) select +@key+N from +@targettable +@swhere
exec sp_executesql @table
set @table=Nselect R.* from +@targettable+N R,#t t where R.+@key+N=t.username
+N and t.id>+cast(@PageLowerBound as nvarchar(30))+N and t.id<=+cast(@PageUpperBound
as nvarchar(30))
exec sp_executesql @table
select @allnum
set rowcount 0
end
set nocount off
GO
调用试例
SqlConnection sconn=new SqlConnection(conn); //建立连接
SqlCommand scomm=new SqlCommand();
scomm.Connection=sconn;
scomm.CommandText="page_res"; //存储过程名称
scomm.CommandType=CommandType.StoredProcedure;//command为存储
//过程----下面为添加各种参数---
SqlParameter sp=new SqlParameter("@targettable",SqlDbType.NVarChar,50);
sp.Direction=ParameterDirection.Input;
sp.Value="qyml";
scomm.Parameters.Add(sp);
sp=new SqlParameter("@key",SqlDbType.NVarChar,50);
sp.Direction=ParameterDirection.Input;
sp.Value="id";
scomm.Parameters.Add(sp);
sp=new SqlParameter("@swhere",SqlDbType.NVarChar,4000);
sp.Direction=ParameterDirection.Input;
sp.Value=" where 1=1 ";
scomm.Parameters.Add(sp);
sp=new SqlParameter("@pwhere",SqlDbType.NVarChar,4000);
sp.Direction=ParameterDirection.Input;
sp.Value=" where 1=1 ";
scomm.Parameters.Add(sp);
sp=new SqlParameter("@pageSize",SqlDbType.Int);
sp.Direction=ParameterDirection.Input;
sp.Value=5;
scomm.Parameters.Add(sp);
sp=new SqlParameter("@pageIndex",SqlDbType.Int);
sp.Direction=ParameterDirection.Input;
sp.Value=pageindex;
scomm.Parameters.Add(sp);
sp=new SqlParameter("@allnum",SqlDbType.Int);
sp.Direction=ParameterDirection.Output;
sp.Value=0;
scomm.Parameters.Add(sp);
SqlDataAdapter sda=new SqlDataAdapter(scomm);//声明数据适配器
DataSet ds=new DataSet();
sda.Fill(ds,"coms");// 用存储过程返回的行填充dataset
coms.DataSource=ds.Tables[0].DefaultView;
coms.DataBind();//将数据绑定到datagrid上面
有一个别人写的xml的htc,要的话msg我你的email
顶,接点分^_^
无聊就接分来了
http://blog.csdn.net/zhzuo/archive/2004/10/29/158638.aspx
使用存储过程分页,每次只获取需要的数据。
参考--
http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx
存储过程我不太懂,应该可以。我知道的就是用SQL分。
存储过程,李洪根测试过,不要使用临时表
用获取上一页最后一条数据id,然后select 这一页的数据 id+1 到id+1+pagesize
----------------------------------------------------
-- 分页
----------------------------------------------------
CREATE PROCEDURE GetRecords
@tblName VARCHAR(255), -- 表名
@fldName VARCHAR(255), -- 字段名
@strFields VARCHAR(5000) = *, -- 获取的字段字符串
@PageSize INT = 10, -- 页尺寸
@PageIndex INT = 0, -- 页码 (从0开始)
@OrderType BIT = 0, -- 设置排序类型, 非 0 值则降序
@strWhere VARCHAR(1000) = -- 查询条件 (注意: 不要加 where)
AS
DECLARE @strSQL VARCHAR(8000) -- 主语句
DECLARE @strCountSQL VARCHAR(2000) -- 统计总记录数语句
DECLARE @strTmp VARCHAR(1000) -- 临时变量
DECLARE @strOrder VARCHAR(1000) -- 排序类型
DECLARE @fldInName VARCHAR(255) -- 内层字段名
DECLARE @prefix INT -- 字段名前缀位置
DECLARE @fldNameLen INT -- 字段名长度
SET NOCOUNT ON
SET @prefix = CHARINDEX(".", @fldName)
-- 判断字段名是否含有前缀
IF @prefix > 0
BEGIN
SET @fldNameLen = LEN(@fldName)
SET @fldNameLen = @fldNameLen - @prefix
SET @prefix = @prefix + 1
SET @fldInName = SUBSTRING(@fldName, @prefix, @fldNameLen)
END
ELSE
SET @fldInName = @fldName
-- 是否降序排序
IF @OrderType <> 0
BEGIN
SET @strTmp = " <(SELECT MIN"
SET @strOrder = " ORDER BY " + @fldName +" DESC"
END
ELSE
BEGIN
SET @strTmp = " >(SELECT MAX"
SET @strOrder = " ORDER BY " + @fldName +" ASC"
END
-- 是否为第一页
IF @PageIndex = 0
BEGIN
SET @strTmp = ""
IF @strWhere <>
SET @strTmp = " WHERE (" + @strWhere + ")"
SET @strSQL = "SELECT TOP " + STR(@PageSize) + " " + @strFields + " FROM " + @tblName + @strTmp + " " + @strOrder
END
ELSE
BEGIN
IF @strWhere <>
SET @strSQL = "SELECT TOP " + STR(@PageSize) + " " + @strFields + " FROM "
+ @tblName + " WHERE " + @fldName + @strTmp + "([" + @fldInName + "]) FROM (SELECT TOP "
+ STR(@PageIndex * @PageSize) + " " + @fldName + " FROM " + @tblName + " WHERE (" + @strWhere + ") "
+ @strOrder + ") AS tblTmp) AND (" + @strWhere + ") " + @strOrder
ELSE
SET @strSQL = "SELECT TOP " + STR(@PageSize) + " " + @strFields + " FROM "
+ @tblName + " WHERE " + @fldName + @strTmp + "([" + @fldInName + "]) FROM (SELECT TOP "
+ STR(@PageIndex * @PageSize) + " " + @fldName + " FROM " + @tblName + @strOrder + ") AS tblTmp)"
+ @strOrder
END
-- 统计总记录数
SET @strTmp = ""
IF @strWhere <>
SET @strTmp = " WHERE (" + @strWhere + ")"
SET @strCountSQL = "SELECT COUNT(" + @fldName + ") AS Total FROM " + @tblName + @strTmp
EXEC (@strSQL)
EXEC (@strCountSQL)
RETURN 0