行政区划程序的设计(十五)

Author:水如烟

总目录:行政区划数据方案设计

 上一篇,行政区划程序的设计(十四),代码的整理。

在上面的代码整理中,由于引入了泛型类DataTableCollection,使我在处理相同结构的表的集合时方便顺畅多了。
从这篇开始,我打算用两篇来说说获取区划代码信息功能的实现。
由于要实现离线查询,实现起来并不是很简单的事。

先重温一下这个流程:

再具体一些,就是这样:

这一篇,说的是右边的“查询对应版本数据”。下一篇说左边的流程。

与上面实现数据更新功能类似,为了保存数据到本地,先继承DataTableCollection建立两个类,一个是RegionalCodeDataSet,存从服务器查询到的区划信息;另一个是VersionDateDataSet,存从服务器查询到的版本信息。

由于DataTableCollection只针对唯一结构的DataTable进行处理的,所以只能这样,建两个。

这篇的代码都是在RegionalCodeCommon项目上实现。

RegionalCodeDataSet.vb

Namespace  Database
    
Public   Class  RegionalCodeDataSet
        
Inherits  LzmTW.uSystem.uData.DataTableCollection( Of  dsRegionalCode.AllInformationsDataTable)

    
End Class
End Namespace

VersionDateDataSet.vb
由于只有一个版本集,DataSet里头最多只能有一个DataTable。数据的追加是对表的追加。因此需做处理

类DataTableCollection追加数据的原代码如下

         Private   Sub  AddTable( ByVal  table  As  T)
        
'     '如果已存在,则去除
             Dim  tmpTableName  As   String   =  table.TableName
            Remove(tmpTableName)

            gDataSet.Tables.Add(table)
           gTableNameList.Add(tmpTableName)

        
End Sub

将DataTableCollection的Private Sub AddTable(ByVal table As T)修改为
Protected Overridable Sub AddTable(ByVal table As T),即

         Protected   Overridable   Sub  AddTable( ByVal  table  As  T)
            
' 如果已存在,则去除
             Dim  tmpTableName  As   String   =  table.TableName
            Remove(tmpTableName)

            gDataSet.Tables.Add(table)
            gTableNameList.Add(tmpTableName)

        
End Sub

现在可以编写VersionDateDataSet.vb,

Namespace  Database
    
Public   Class  VersionDateDataSet
        
Inherits  LzmTW.uSystem.uData.DataTableCollection( Of  dsRegionalCode.VersionsDataTable)

        
Protected   Overrides   Sub  AddTable( ByVal  table  As  dsRegionalCode.VersionsDataTable)
            
If   Me .IsEmpty  Then
                
MyBase .AddTable(table)
            
Else
                
With   Me .DataTables( 0 )
                    .Merge(table)
                    .AcceptChanges()
                
End   With
            
End   If
        
End Sub

    
End Class
End Namespace

 下面是主功能代码,类RegionalCodeServiceBase,区划信息集,可离线
三个文件,

RegionalCodeServiceBase.vb,基本属性

Namespace  Services
    
Public   MustInherit   Class  RegionalCodeServiceBase
        
Public   Event  ServiceMessage  As  ServiceMessageHandler

        
' 数据来源
         Private  gSource  As  DataSource  =  DataSource.离线数据优先
        
Public   Property  Source()  As  DataSource
            
Get
                
Return  gSource
            
End   Get
            
Set ( ByVal  value  As  DataSource)
                gSource 
=  value
            
End   Set
        
End Property

        
' 版本列表,用来判断某查询日期对应的版本日期
         Private  gVersionDateList  As   New  VersionDateList

        
' '' <summary>
         ' '' 起用最旧版本
         ' '' </summary>
         ' '' <remarks>如查询日期早于最旧版本日期,使用最旧的版本</remarks>
         Public   Property  UseOldestVersion()  As   Boolean
            
Get
                
Return  gVersionDateList.UseOldestVersion
            
End   Get
            
Set ( ByVal  value  As   Boolean )
                gVersionDateList.UseOldestVersion 
=  value
            
End   Set
        
End Property

        
' 存放区划码信息的文件
         Private  gRegionalCodeFileName  As   String   =   ""
        
Public   Property  RegionalCodeFileName()  As   String
            
Get
                
Return  gRegionalCodeFileName
            
End   Get
            
Set ( ByVal  value  As   String )
                gRegionalCodeFileName 
=  value
            
End   Set
        
End Property

        
' 存放服务器当前版本集的文件
         Private  gVersionDateFileName  As   String   =   ""
        
Public   Property  VersionDateFileName()  As   String
            
Get
                
Return  gVersionDateFileName
            
End   Get
            
Set ( ByVal  value  As   String )
                gVersionDateFileName 
=  value
            
End   Set
        
End Property

        
' 保存区划码信息,文件可能较大
         Private  gRegionalCodeDataSet  As   New  Database.RegionalCodeDataSet

        
' 保存服务器当前版本集
         Private  gVersionDateDataSet  As   New  Database.VersionDateDataSet

        
' 取服务器数据的服务
         Private   WithEvents  gGetDataService  As  RegionalCodeCommon.Interface.IServerServices


        
' '' <param name="getDataService">服务器数据服务</param>
         Sub   New ( ByVal  getDataService  As  RegionalCodeCommon.Interface.IServerServices)
            gGetDataService 
=  getDataService
        
End Sub

        
Private   Sub  gGetDataService_ServiceMessage( ByVal  sender  As   Object ByVal  message  As   String ) _
        
Handles  gGetDataService.ServiceMessage
            SendMessage(message)
        
End Sub

        
Private   Sub  SendMessage( ByVal  message  As   String )
            
RaiseEvent  ServiceMessage( Nothing , message)
        
End Sub

        
' '' <summary>
         ' '' 数据来源
         ' '' </summary>
         Public   Enum  DataSource
            总是使用服务器数据
            离线数据优先
        
End Enum

    
End Class
End Namespace

上面用到的VersionDateList,用来获取查询日期对应的版本日期,我已由静态类改为实例类。

Public   Class  VersionDateList
    
Private  gList  As   New  List( Of   String )
    
Private   Const  EMPTY  As   String   =   " Empty "
    
Private  gUseOldestVersion  As   Boolean   =   True

    
Public   ReadOnly   Property  ListIsEmpty()  As   Boolean
        
Get
            
Return  (gList.Count  =   0 )
        
End   Get
    
End Property

    
Public   Property  UseOldestVersion()  As   Boolean
        
Get
            
Return  gUseOldestVersion
        
End   Get
        
Set ( ByVal  value  As   Boolean )
            gUseOldestVersion 
=  value
        
End   Set
    
End Property

    
Public   ReadOnly   Property  Contains( ByVal  versionDate  As   String As   Boolean
        
Get
            
Return  gList.Contains(versionDate)
        
End   Get
    
End Property

    
Public   Sub  Add( ByVal  versionDate  As   String )
        
SyncLock  gList
            
If  Contains(versionDate)  Then   Exit Sub

            gList.Add(versionDate)
            OrderByAsc()
        
End   SyncLock
    
End Sub

    
Public   Sub  Remove( ByVal  versionDate  As   String )
        
SyncLock  gList
            
If   Not  Contains(versionDate)  Then   Exit Sub

            gList.Remove(versionDate)
            OrderByAsc()
        
End   SyncLock
    
End Sub

    
Public   Function  GetVersionDate( ByVal  queryDataDate  As  DateTime)  As   String
        
Dim  mQueryDataDate  As   String   =  queryDataDate.ToString( " yyyyMMdd " )
        
Return  GetVersionDate(mQueryDataDate)
    
End Function

    
Public   Function  GetVersionDate( ByVal  queryDataDate  As   String As   String
        
Dim  mResult  As   String   =  EMPTY

        
If  ListIsEmpty  Then   Return  mResult

        
For   Each  versionDate  As   String   In  gList
            
If  queryDataDate  >=  versionDate  Then
                mResult 
=  versionDate
                
Exit   For
            
End   If
        
Next

        
If  mResult  =  EMPTY  AndAlso  UseOldestVersion  Then
            mResult 
=  gList(gList.Count  -   1 )
        
End   If

        
Return  mResult
    
End Function

    
Public   Sub  Clear()
        gList.Clear()
    
End Sub

    
Private   Sub  OrderByAsc()
        gList.Sort()
        
If  gList(gList.Count  -   1 >  gList( 0 Then
            gList.Reverse()
        
End   If
    
End Sub

End Class

RegionalCodeServiceBase.Local.vb,本地数据

Namespace  Services
    
Partial   Class  RegionalCodeServiceBase
        
' 本地离线文件

        
Public   Sub  Load()
            SendMessage(
" 正在加载离线数据... " )

            
Me .gRegionalCodeDataSet.ReadXml( Me .RegionalCodeFileName)
            
Me .gVersionDateDataSet.ReadXml( Me .VersionDateFileName)

            
' 版本也追加到版本列表中
            RefleshVersionDateList()

            SendMessage(
" 待命 " )
        
End Sub

        
Public   Sub  Save()
            SendMessage(
" 正在保存离线数据... " )

            
Me .gRegionalCodeDataSet.WriteXml( Me .RegionalCodeFileName)
            
Me .gVersionDateDataSet.WriteXml( Me .VersionDateFileName)

            SendMessage(
" 待命 " )
        
End Sub

        
Private   Sub  RefleshVersionDateList()
            
If   Not   Me .gVersionDateDataSet.IsEmpty  Then
                
For   Each  row  As  Database.dsRegionalCode.VersionsRow  In   Me .gVersionDateDataSet.DataTables( 0 ).Rows
                    
Me .gVersionDateList.Add(row.版本日期)
                
Next
            
End   If
        
End Sub


        
Public   Sub  Clear()
            
Me .gRegionalCodeDataSet.Clear()
            
Me .gVersionDateDataSet.Clear()
            
Me .gVersionDateList.Clear()
        
End Sub
    
End Class
End Namespace

RegionalCodeServiceBase.Query.vb,查询

Namespace  Services
    
Partial   Class  RegionalCodeServiceBase

        
' '' <summary>
         ' '' 判断查询日期所在的版本日期与当前版本日期是否相等
         ' '' </summary>
         ' '' <param name="queryDataDate">查询日期</param>
         ' '' <param name="currentDataDate">当前版本日期</param>
         Public   Function  IsSameDataDate( ByVal  queryDataDate  As  DateTime,  ByVal  currentDataDate  As   String As   Boolean
            
Return  currentDataDate.Equals( Me .gVersionDateList.GetVersionDate(queryDataDate))
        
End Function

        
' '' <summary>
         ' '' 取区划信息
         ' '' </summary>
         ' '' <param name="queryDataDate">查询日期</param>
         Public   Function  GetAllInformationsTable( ByVal  queryDataDate  As  DateTime)  As  RegionalCodeCommon.Database.dsRegionalCode.AllInformationsDataTable
            
Dim  mQueryDataDate  As   String   =   Me .gVersionDateList.GetVersionDate(queryDataDate)

            
If   Not   Me .gRegionalCodeDataSet.Contains(mQueryDataDate)  Then
                
Me .GetAllInformationsTableFromServer(mQueryDataDate)
            
Else
                
If   Me .Source  =  DataSource.总是使用服务器数据  Then
                    
Me .GetAllInformationsTableFromServer(mQueryDataDate)
                
End   If
            
End   If

            
If   Me .gRegionalCodeDataSet.IsEmpty  Then
                
Return   Nothing
            
End   If

            
Return   Me .gRegionalCodeDataSet.Item(mQueryDataDate)
        
End Function

        
' '' <summary>
         ' '' 取版本集
         ' '' </summary>
         Public   Function  GetVersionsDataTable()  As  RegionalCodeCommon.Database.dsRegionalCode.VersionsDataTable
            
If   Me .gVersionDateDataSet.IsEmpty  Then
                
Me .GetVersionsDataTableFromServer()
            
Else
                
If   Me .Source  =  DataSource.总是使用服务器数据  Then
                    
Me .GetVersionsDataTableFromServer()
                
End   If
            
End   If

            
If   Me .gVersionDateDataSet.IsEmpty  Then
                
Return   Nothing
            
End   If

            
Return   Me .gVersionDateDataSet.DataTables( 0 )
        
End Function

        
' ******以下取服务器数据

        
Private   Sub  GetVersionsDataTableFromServer()
            
Dim  mTable  As  DataTable  =   Me .gGetDataService.GetDataVersionTable
            
Me .gVersionDateDataSet.Add(mTable)
            
Me .RefleshVersionDateList()
        
End Sub

        
Private   Sub  GetAllInformationsTableFromServer( ByVal  queryDataDate  As   String )
            
Dim  mTable  As  DataTable  =   Me .gGetDataService.GetAllInformationsTable(queryDataDate)
            
If  mTable.TableName  <>   " Empty "   Then   Me .gRegionalCodeDataSet.Add(mTable)
        
End Sub

    
End Class
End Namespace

示意图:

下面说用户界面上的查询。

下一篇,行政区划程序的设计(十六),实现获取区划信息功能_2。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值