C/S框架-WebService架构下分页查询数据解决方案


  C/S框架-WebService架构下分页查询数据解决方案
企业管理系统开发框架|www.csframework.com C/S框架-WebService架构下分页查询数据解决方案


C/S框架-WebService架构下分页查询数据解决方案


使用WebService架构开发的数据库应用软件不适合大批量下载数据,不是技术不能实现,而是广域网络太娇情!若有光纤的速度,一次Download 100W记录也不算多啊!网速限制只能从技术上突破,优化下载速度是使用WebService构架开发系统必须重视的工作,我们可以从下面几部分入手:


1. 数据分页查询。
2. 数据压缩。
3. 优化后台程序,包括数据层逻辑处理及存储过程优化。
4. WebService安全,防止黑客攻击。
5. 限制用户查询次数。
6. 服务器硬件配置,配置高与查数据成正比。


本文详细介绍数据分页查询,下图是PageCache逻辑结构:





程序界面:


数据查询界面,四个蓝色按钮分别是:最前页,上一页,下一页,最后页,下图是查询了第一页的数据。





查询最后一页的数据,请看缓存进度。








接口/具体类介绍:


          


IMyDataView:数据视图接口,已扩展了Dev GridView,通过这个接口可以扩展TreeView显示数据,如何展示数据在SetDataSource方法内实现。






             

IMyPageDataCache:数据分页查询业务逻辑接口。

MyDataTablePageCache:类,使用DataTable缓存数据的类,如果您用到实体类ORM, 扩展为IList即可。







ISupportPageSearch:支持分页查询的接口,该接口用于具体的业务逻辑类(BLL),如SO,销售订单业务逻辑。

MyTestBLL:用于测试的业务逻辑类,实现ISupportPageSearch接口,该类模拟销售订单业务逻辑查询数据。



接口源码:


C# Code:

/// <summary>
/// 缓存数据接口
/// </summary>
public interface IMyPageDataCache
{
   /// <summary>
   /// 每页记录数
   /// </summary>
   int PageSize { get; set; }
   
   /// <summary>
   /// 本次查询总页数
   /// </summary>
   int PageCount { get; }
   
   /// <summary>
   /// 当前页号
   /// </summary>
   int CurrentPage { get; }
   
   /// <summary>
   /// 已缓存的页数
   /// </summary>
   int CachedPage { get; }
   
   /// <summary>
   /// 按页号取出缓存数据
   /// </summary>
   /// <param name="pageNo">页号</param>
   /// <returns></returns>
   DataTable GetPageData(int pageNo);
   
   /// <summary>
   /// 初始化缓存数据管理器,第一次搜索时调用此方法。
   /// </summary>
   /// <param name="searchConditions"></param>
   void InitializeSearch(object[] searchConditions);
   
   /// <summary>
   /// 清空缓期数据
   /// </summary>
   void ClearCache();
}


//来源:C/S框架网(www.csframework.com) QQ:1980854898





C# Code:


/// <summary>
/// 支持按页搜索的接口,由具体的BLL层实现, 如:SO,Customer
/// </summary>
public interface ISupportPageSearch
{
   /// <summary>
   /// 搜索指定页面的数据
   /// </summary>
   /// <param name="searchConditions">查询条件(数组)</param>
   /// <param name="pageNo">页号</param>
   /// <param name="pageSize">每页记录数</param>
   /// <returns></returns>
   DataTable SearchByPage(object[] searchConditions, int pageNo, int pageSize);
   
   /// <summary>
   /// 获取本次搜索返回的页数
   /// </summary>
   /// <param name="searchConditions">查询条件(数组)</param>
   /// <returns></returns>
   int GetPageCount(object[] searchConditions, int pageSize);
}

//来源:C/S框架网(www.csframework.com) QQ:1980854898




C# Code:


/// <summary>
/// 数据视图接口
/// </summary>
public interface IMyDataView
{
   /// <summary>
   /// 设置数据源
   /// </summary>
   /// <param name="dataSource">数据源</param>
   void SetDataSource(object dataSource);
}



分页查询存储过程:

这个SP效率不高,您可以写高效率的SP,当然条件字段必须建立索引大大提高查询速度。


SQL:
 

ALTER PROCEDURE [dbo].[usp_SearchSO]

  @BeginDate DATETIME,

  @EndDate DATETIME,

  @PageNo INT,

  @PageSize INT,

  @IsGetPageCount CHAR(1) --Y/N

AS

BEGIN

/******************************************************

    说明:按页查询数据

    原创:C/S框架网www.csframework.com

 

    usp_SearchSO '2011-01-01','2011-12-30',2,5,'N'

 

*******************************************************/

    IF @PageNo=0 SET @PageNo=1

    IF @PageSize=0 SET @PageSize=1

    --------------------------------------------------------------------  

 

    IF (@IsGetPageCount='Y')

    BEGIN

       PRINT '取本次查询返回的页数'

 

       DECLARE @ROWS INT,@PAGE_COUNT INT

       SET @PAGE_COUNT=0

       SELECT @ROWS=COUNT(ISID) FROM tb_SO WHERE DocDate BETWEEN @BeginDate AND @EndDate

       IF (@ROWS>0)

       BEGIN

         SET @PAGE_COUNT=@ROWS/@PageSize

         IF (@ROWS % @PageSize)>0 SET @PAGE_COUNT=@PAGE_COUNT+1

       END

       SELECT @PAGE_COUNT AS PAGE_COUNT

       RETURN

    END

 

    -----------------------------------------------------------------------

    DECLARE @SQL NVARCHAR(2000),@WHERE NVARCHAR(100),@PriorPageMaxID INT,@PriorPageRows INT

    --DROP TABLE ##PRIOR_PAGE_MAX_ID  

    CREATE TABLE ##PRIOR_PAGE_MAX_ID(MAX_ID INT)

 

    SET @PriorPageRows=(@PageNo-1)*@PageSize

   

    SET @WHERE=' WHERE CONVERT(VARCHAR,DocDate,112) BETWEEN '+CONVERT(VARCHAR,@BeginDate,112) + ' AND '+CONVERT(VARCHAR,@EndDate,112)

 

    SET @SQL=' INSERT INTO ##PRIOR_PAGE_MAX_ID SELECT MAX(T.ISID) AS MAX_ID FROM (SELECT TOP '+CAST(@PriorPageRows AS VARCHAR)+' ISID FROM tb_SO '+@WHERE+') T '

    PRINT @SQL

    EXEC(@SQL)

 

    SELECT @PriorPageMaxID=ISNULL(MAX_ID,0) FROM ##PRIOR_PAGE_MAX_ID

 

    SET @SQL=' SELECT TOP '+CAST(@PageSize AS VARCHAR)+' * FROM tb_SO '+@WHERE

    SET @SQL=@SQL+' AND ISID>'+CAST(@PriorPageMaxID AS VARCHAR)

 

    -----------------------------------------------------------------------------

    PRINT @SQL

    EXEC(@SQL)

 

    DROP TABLE ##PRIOR_PAGE_MAX_ID 

 

END

 




如转载请注明出处:C/S框架网 www.csframework.com

Source Code for VIP:

开发环境:VS2008+DevExpress 9.24
数据库在Debug目录下。



C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:支付宝付款操作步骤
下一篇:C/S框架-WebService架构用户凭证(令牌)解决方案
评论列表

发表评论

评论内容
昵称:
关联文章

C/S框架-WebService架构查询数据解决方案
C/S框架-WebService架构用户凭证(令牌)解决方案
SQL2008多个查询条件查询脚本(原创)
原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案
SQL查询多种写法
数据查询支持两种数据展示方式
C/S架构快速开发平台提供高级查询功能 - 自定义查询条件搜索数据
架构C#WebService程序
.Net 高性能表分库组件 (类似ShardingSphere原理)
C# C/S架构客户、供应商等大批量数据单条记录选取组件
生成的项目模块(Project)添加到VS解决方案 - C/S框架三层架构代码生成器操作指南
隐藏界面的明细编辑数据编辑】
C/S架构轻量级快速开发框架WinFramework-VS解决方案和工程项目
Winform快速开发框架之存储图片资源解决方案|C/S框架
生成的窗体Form源码集成到VS解决方案 - C/S框架三层架构代码生成器操作指南
代码生成器加载用户表和视图报错解决方案|C/S框架
Winform查询数据对话窗体与选择资料窗体实现|C/S框架
基于WebService架构C/S系统
企业级数据权限框架 - 集团组织架构数据权限开发框架(C/S+Winform+DevExpress)
C/S开发框架DAL层提交数据报错"外键值为空!"解决方案