本文主要探讨,客户端如何通过TCP通信,根据分页信息从服务器获取到相关数据

通常情况下,数据可能很多,比如几千或者几万条,并不适合一次性从服务器获取。

我们只从服务器获取当前页的数据 和数据库中记录总数以便我们可以在客户端计算出页数 ,当用户点击“上一页”或者“下一页”时,再获取相应页的数据

如下图:

客户端通过TCP通信分页从服务器获取数据_TCP

双击上图中的某一项,再打开详细页面,如下图:

客户端通过TCP通信分页从服务器获取数据_TCP_02

下面我们从头开始创建一个分页显示的Demo

通信框架采用来自英国开源的networkcomms2.3.1版本

数据库为sql2005

第一步,在数据库中建表

客户端通过TCP通信分页从服务器获取数据_网络通信_03

Create Table  PlDocs(

ID int identity(1000,1) primary key,

Title nvarchar(200),

Description  nvarchar(500))

客户端通过TCP通信分页从服务器获取数据_网络通信_03

ID 是流水号 主键

Title  公文名称

Description  公文的详细描述

第二步:打开 vs 2010 创建工程文件

为了简单,基于上一篇文章  基于TCP通信的客户端断线重连  创建的工程文件继续

客户端通过TCP通信分页从服务器获取数据_通信分页_05

 

添加2个新类库

客户端通过TCP通信分页从服务器获取数据_TCP_06

 

第三步:打开CodeSmith模板  创建相关的“存储过程”,数据层代码   逻辑层代码  模板从此文中下载  【模板下载】分享我所使用的数据库框架

客户端通过TCP通信分页从服务器获取数据_TCP_07

(1):第一个模板的生成的存储过程如下:

客户端通过TCP通信分页从服务器获取数据_TCP_08 存储过程

 大家可以看到上面自动生成的存储过程中,包含分页存储过程,就是这一个,后面我们会用到

客户端通过TCP通信分页从服务器获取数据_网络通信_03

CREATE PROCEDURE [dbo].PlDocs_SelectPage-- Author:               msdc-- Created:             2015-2-28-- Last Modified:         2015-2-28@PageNumber             int,@PageSize             intASDECLARE @PageLowerBound intDECLARE @PageUpperBound intSET @PageLowerBound = (@PageSize * @PageNumber) - @PageSizeSET @PageUpperBound = @PageLowerBound + @PageSize + 1CREATE TABLE #PageIndex 
(
    IndexID int IDENTITY (1, 1) NOT NULL,
ID Int)BEGININSERT INTO #PageIndex ( 
ID
)SELECT
        [ID]
        FROM
        [dbo].[PlDocs]
        -- WHERE-- ORDER BYENDSELECT
        t1.*
        FROM
        [dbo].[PlDocs] t1JOIN            #PageIndex t2ON            
        t1.[ID] = t2.[ID]
        WHERE
        t2.IndexID > @PageLowerBound 
        AND t2.IndexID < @PageUpperBound
        ORDER BY t2.IndexIDDROP TABLE #PageIndexGOSET ANSI_NULLS OFF GOSET QUOTED_IDENTIFIER OFF GO

客户端通过TCP通信分页从服务器获取数据_网络通信_03

PageNumber 是第几页

PageSize 是每页显示多少条

 

(2):继续使用模板生成数据层  (生成的数据层代码 与第一步生成的存储过程 是自动关联的)(命名空间需要手动改一下)

客户端通过TCP通信分页从服务器获取数据_TCP_11 数据层代码

数据层还用到了基本SQL 操作类,每次使用复制过来即可 

客户端通过TCP通信分页从服务器获取数据_通信分页_12

 

(3):继续使用模板生成逻辑层代码 

客户端通过TCP通信分页从服务器获取数据_网络通信_13

逻辑层中有2个类:(命名空间需要手动改一下)

客户端通过TCP通信分页从服务器获取数据_通信分页_14 实体类

客户端通过TCP通信分页从服务器获取数据_TCP_15 操作类

 至此,模板的工作完成,工程文件目前的状态如下:

客户端通过TCP通信分页从服务器获取数据_TCP_16

 

在逻辑层中添加2个契约类,用于客户端与服务器端的通信 (序列化方法使用protobuf.net)

客户端通过TCP通信分页从服务器获取数据_TCP_17 PageInfoContract 当前是第几页 每页显示多少条

客户端通过TCP通信分页从服务器获取数据_网络通信_18 根据信息获取到的公文

客户端相关代码:

客户端通过TCP通信分页从服务器获取数据_TCP_19 客户端相关代码

服务器端相关代码:

 NetworkComms.AppendGlobalIncomingPacketHandler<PageInfoContract>("GetAllDocs", IncomingGetAllDocs);

客户端通过TCP通信分页从服务器获取数据_通信分页_20 IncomingGetAllDocs

数据操作类和存储过程,本Demo中不需要再修改。

如果您的使用环境中,增加了关键字或者类别的设定,数据操作类和存储过程需要进行相关的修改.

到这里  示例就完成了  我们看一下界面:

客户端通过TCP通信分页从服务器获取数据_通信分页_21

客户端通过TCP通信分页从服务器获取数据_TCP_22

下载地址