开发工具: VS 2005
开发语言: C#
项目类别: Windows应用程序
所用组件: DataGridView
实现功能: 分页
问题描述:以前我是做ASP的, 写程序很灵活, 分页代码很简单 用 RecordSet 对象的 pageCount 属性设置每页显示多少条记录,pageCount 属性返回总页码, AbsolutePage 属性设置当前第几页,这就好了。可是在C#中不知道该怎么来实现了。请大侠们指点迷津思路一: 一次性 读出 全部数据, 在程序中 利用其它方法 每次显示 指定数目的记录来实现 分页 (这种思路就不要考虑了,我不太喜欢这种方式,甚至我认为这种方式算不上真正意义上的分页,当记录量特别大的时候,一次性读出的话,那得要多久啊,如果再加上过滤条件, where comment like '%快点吧%' , 那真是..)所以 我要实现的是 一次只读那么要显示的几条记录, 如果点击下一页, 再从库中读几条。要几条读几条。
开发语言: C#
项目类别: Windows应用程序
所用组件: DataGridView
实现功能: 分页
问题描述:以前我是做ASP的, 写程序很灵活, 分页代码很简单 用 RecordSet 对象的 pageCount 属性设置每页显示多少条记录,pageCount 属性返回总页码, AbsolutePage 属性设置当前第几页,这就好了。可是在C#中不知道该怎么来实现了。请大侠们指点迷津思路一: 一次性 读出 全部数据, 在程序中 利用其它方法 每次显示 指定数目的记录来实现 分页 (这种思路就不要考虑了,我不太喜欢这种方式,甚至我认为这种方式算不上真正意义上的分页,当记录量特别大的时候,一次性读出的话,那得要多久啊,如果再加上过滤条件, where comment like '%快点吧%' , 那真是..)所以 我要实现的是 一次只读那么要显示的几条记录, 如果点击下一页, 再从库中读几条。要几条读几条。
一次性读出来的分页可以绑定克隆表每,这样的话对Dataset的处理也局限在一个部分并没有你所说的那么恐怖吧?
public int Fill(
DataSet dataSet,
int startRecord,
int maxRecords,
string srcTable
)
来自MSDN
SQL语句百度能搜到一大堆,推荐用存储过程
我照这个思路倒是实现分页了,但是只是全部结果分页,我还想实现自定义查找,对查找结果也分页。但是:1 我得不到查找结果 2 没结果当然不能分页。我的实现办法,从用户输入中处理后得到 string filter = " where [时间] between [时间1] and [时间2] ..." 传给 select * from 表 @filter , 然后 提示SQL语句无效。 请各位给个解决办法。
对于存储过程,我也用了一个,在网上找的。代码我就不粘了,我说下他的思路。把过滤条件以字符形式写进一个字符形式的SQL语句中,然后用 exec(@sql) 来得到结果并从中取得 第 (page-1)*pageSize 到 page*pageSize 之间的结果,但是因为它是 exec 来得到的结果,把这个存储过程拉到 VS 2005 的 dataset.xsd 资源管理器中后,虽然生成了 QueryAdapter 但是我却不知道该怎么来得到输出结果。我的方法不知道错哪里?
QueryAdapter myQuery = new QueryAdapter()
myQuery.getResult(参数); 输出结果为 -1;
不知道该如何用?还有 那个 DataSet.xsd 在 资源管理器中 修改过后,一旦保存,我在它的设计.CS 中所修改的代码全部被重写,令我很郁闷。我只好把它以XML文件形式打开来修改某参数,然后再生成。不知道各位高手,这种情况该如何处理?我这种处理方式合不合适?
呵呵,我是新手,问题较多, 望各位高手不吝赐教。
SQL语句百度能搜到一大堆,推荐用存储过程
(
@sTable nvarchar(1000), --表名
@sPkey nvarchar(50), --主键(一定要有)
@sField nvarchar(1000)='*', --字段
@iPageCurr int, --当前页数
@iPageSize int, --每页记录数
@sCondition nvarchar(1000), --条件(不需要where)
@sOrder nvarchar(200) , --排序(不需要order by,需要asc和desc字符)
@Counts int=0 output, --记录条数(已有值:外部赋值,0执行count)
@pageCount int=1 output --查询结果分页后的总页数
)
AS
SET NOCOUNT ON
DECLARE @sC1 nvarchar(1000),@sC2 nvarchar(1000)
DECLARE @iAsc int,@iDesc int,@iType tinyint
DECLARE @sT1 nvarchar(1000),@sT2 nvarchar(1000),@sT3 nvarchar(1000),@sT4 nvarchar(1000),@sSQL nvarchar(4000)
/*----------------------判断where 条件是否空值-------------------*/
IF LEN(@sCondition)>2
SELECT @sC1=' WHERE '+@sCondition+' ', @sC2=' WHERE '+@sCondition+' AND '
ELSE
BEGIN
SELECT @sC1='', @sC2=' WHERE '
END
SELECT @sT1=UPPER(@sOrder), @sT2=@sOrder, @iType=0, @sOrder='', @sT4=UPPER(@sPkey)
/*-----------------------获取查询的数据行数---------------------*/
IF LEN(@sT2)>2
BEGIN
SELECT @iAsc=0, @iDesc=0
IF @sT4=SUBSTRING(@sT1,0,LEN(@sT4)) --存在主建
BEGIN
SELECT @iAsc=CHARINDEX('ASC',@sT1), @iDesc=CHARINDEX('DESC',@sT1)
END
IF (@iAsc>0 and @iDesc=0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc<@iDesc))
SELECT @iType=1, @sT3='>(SELECT MAX('
ELSE IF (@iAsc=0 and @iDesc>0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc>@iDesc))
BEGIN
SELECT @iType=1, @sT3='<(SELECT MIN('
END
SET @sOrder=' ORDER BY '+@sT2
END
/*-------------------------获取查询的数据行数----------------------*/
--IF (@Counts<1)
--BEGIN
--SET @sSQL='SELECT @Counts=Count(0) FROM '+@sTable+@sC1
--EXEC sp_executesql @sSQL,N'@Counts int OUT',@Counts OUT
--END
SET @sSQL='SELECT @Counts=Count(0) FROM '+@sTable+@sC1
EXEC sp_executesql @sSQL,N'@Counts int OUT',@Counts OUT
SET @pageCount=(@Counts+@ipageSize-1)/@ipageSize
IF @iPageCurr>@pageCount
SET @iPageCurr=@pageCount
SELECT @iPageCurr=(CASE WHEN @Counts<(@iPageCurr-1)*@iPageSize THEN CEILING(@Counts/@iPageSize) WHEN @iPageCurr<1 THEN 1 ELSE @iPageCurr END)
IF (@iPageCurr>1) AND (@iType=1)
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sC2+@sPkey+@sT3+@sPkey+') FROM (SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC1+@sOrder+') AS tbTemp)'+@sOrder
ELSE IF (@iPageCurr>1) AND (@iType=0)
SET @sSQL='SELECT '+@sField+' FROM '+@sTable+@sC2+@sPkey+' IN (SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC2+@sPkey+' NOT IN(SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sC1+@sOrder+')'+@sOrder+')'+@sOrder
ELSE
BEGIN
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sC1+@sOrder
END
EXEC(@sSQL)
GO
我照这个思路倒是实现分页了,但是只是全部结果分页,我还想实现自定义查找,对查找结果也分页。但是:1 我得不到查找结果 2 没结果当然不能分页。我的实现办法,从用户输入中处理后得到 string filter = " where [时间] between [时间1] and [时间2] ..." 传给 select * from 表 @filter , 然后 提示SQL语句无效。 请各位给个解决办法。
对于存储过程,我也用了一个,在网上找的。代码我就不粘了,我说下他的思路。把过滤条件以字符形式写进一个字符形式的SQL语句中,然后用 exec(@sql) 来得到结果并从中取得 第 (page-1)*pageSize 到 page*pageSize 之间的结果,但是因为它是 exec 来得到的结果,把这个存储过程拉到 VS 2005 的 dataset.xsd 资源管理器中后,虽然生成了 QueryAdapter 但是我却不知道该怎么来得到输出结果。我的方法不知道错哪里?
QueryAdapter myQuery = new QueryAdapter()
myQuery.getResult(参数); 输出结果为 -1;
不知道该如何用?还有 那个 DataSet.xsd 在 资源管理器中 修改过后,一旦保存,我在它的设计.CS 中所修改的代码全部被重写,令我很郁闷。我只好把它以XML文件形式打开来修改某参数,然后再生成。不知道各位高手,这种情况该如何处理?我这种处理方式合不合适?
呵呵,我是新手,问题较多, 望各位高手不吝赐教。