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

Author:水如烟

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

 上一篇,行政区划程序的设计(九)


从程序设计开始到完成了RegionalCodeLibary的编写,基本上对整个方案做到了“心中有数”。“虚”的把握了,现在要做的是把“虚”变成“实”。
在项目中,“虚”与“实”也逐步得到体现。基础类也向我们需要的实体类转化。

一般来说,到了应用层,数据类型需要要具体化,既是约束的需要,也是服务的必要。展现给用户的,信息是明确的,意思是明了的。
“虚”“实”转换的任务,就落在RegionalCodeCenter项目上。

而“实”的定义,实体类的定义,若是符合可移植范畴的,在RegionCodeCommon上定义。

下面,看看有哪些信息需要在RegionCodeCommon上明确下来。

项目组织:

数据集有三个:
一是数据库所提供的信息,dsRegionalCode.xsd,


 
二是用户提供给数据库更新用的信息,dsUpdateDatabase.xsd,


 
三是用户从网上获取的信息,dsNetDownload.xsd,


 
上面数据集在特定功能实现时的处理:

下载的数据,因为用时较长,考虑保存到本地,NetDownloadLocalDataSet.vb

Namespace  Database
    
Public   Class  NetDownloadLocalDataSet
        
Private  gDataSet  As   New  DataSet
        
Public   ReadOnly   Property  DataSet()  As  DataSet
            
Get
                
Return  gDataSet
            
End   Get
        
End Property

        
Public   Sub  Clear()
            gDataSet.Clear()
        
End Sub

        
' '' <summary>
         ' '' 添加待更新到数据库的表
         ' '' </summary>
         ' '' <param name="table">表</param>
         ' '' <remarks>表的名称需为版本日期</remarks>
         Public   Sub  Add( ByVal  table  As  dsNetDownload.RegionalCodeDataTable)
            AddUpdateTable(table)

        
End Sub

        
Public   Sub  Add( ByVal  table  As  DataTable)

            
Dim  tmpTable  As   New  dsNetDownload.RegionalCodeDataTable
            
With  tmpTable
                .Load(table.CreateDataReader)
                .TableName 
=  table.TableName
            
End   With

            AddUpdateTable(tmpTable)

        
End Sub

        
Private   Sub  AddUpdateTable( ByVal  table  As  dsNetDownload.RegionalCodeDataTable)
            
Dim  mTable  As  dsNetDownload.RegionalCodeDataTable

            
If   Me .DataSet.Tables.Contains(table.TableName)  Then

                mTable 
=   CType ( Me .DataSet.Tables(table.TableName), dsNetDownload.RegionalCodeDataTable)
                mTable.Clear()
            
Else

                mTable 
=   New  dsNetDownload.RegionalCodeDataTable
                mTable.TableName 
=  table.TableName
                
Me .DataSet.Tables.Add(mTable)
            
End   If

            
With  mTable
                .Merge(table)
                .AcceptChanges()
            
End   With
        
End Sub

        
Public   Sub  LoadDatasFromLocal( ByVal  file  As   String )
            
Dim  tmpDataSet  As   New  DataSet
            tmpDataSet.ReadXml(file)

            
For   Each  table  As  DataTable  In  tmpDataSet.Tables
                
Me .Add(table)
            
Next

            
With  tmpDataSet
                .Clear()
                .Dispose()
            
End   With
        
End Sub

        
Public   Sub  WriteDatasToLocal( ByVal  file  As   String )
            
Dim  mWriteStream  As   New  IO.StreamWriter(file,  False )
            
Me .DataSet.WriteXml(mWriteStream)
            
With  mWriteStream
                .Close()
                .Dispose()
            
End   With
        
End Sub

    
End Class
End Namespace

需更新的数据,UpdateDatabaseDataSet.vb

Namespace  Database
    
Public   Class  UpdateDatabaseDataSet
        
Private  gDataSet  As   New  DataSet
        
Public   ReadOnly   Property  DataSet()  As  DataSet
            
Get
                
Return  gDataSet
            
End   Get
        
End Property

        
Public   Sub  Clear()
            gDataSet.Clear()
        
End Sub

        
' '' <summary>
         ' '' 添加要更新到数据库的表
         ' '' </summary>
         ' '' <param name="table">表</param>
         ' '' <remarks>表的名称需为版本日期</remarks>
         Public   Sub  Add( ByVal  table  As  dsUpdateDatabase.RegionalCodeDataTable)
            AddUpdateTable(table)

        
End Sub

        
' '' <summary>
         ' '' 添加要更新到数据库的表
         ' '' </summary>
         ' '' <param name="table">表</param>
         ' '' <remarks>表的名称需为版本日期</remarks>
         Public   Sub  Add( ByVal  table  As  DataTable)

            
Dim  tmpTable  As   New  dsUpdateDatabase.RegionalCodeDataTable
            
With  tmpTable
                .Load(table.CreateDataReader)
                .TableName 
=  table.TableName
            
End   With

            AddUpdateTable(tmpTable)

        
End Sub

        
Private   Sub  AddUpdateTable( ByVal  table  As  dsUpdateDatabase.RegionalCodeDataTable)
            
Dim  mTable  As  dsUpdateDatabase.RegionalCodeDataTable

            
If   Me .DataSet.Tables.Contains(table.TableName)  Then

                mTable 
=   CType ( Me .DataSet.Tables(table.TableName), dsUpdateDatabase.RegionalCodeDataTable)
                mTable.Clear()
            
Else

                mTable 
=   New  dsUpdateDatabase.RegionalCodeDataTable
                mTable.TableName 
=  table.TableName
                
Me .DataSet.Tables.Add(mTable)
            
End   If

            
With  mTable
                .Merge(table)
                .AcceptChanges()
            
End   With
        
End Sub


    
End Class
End Namespace

一般信息:
下载时需要用到的必要的基本信息,NetCurretnInformations.vb,

Public   Class  NetCurrentInformations
    
Private  gGovernmentDefaultAddress  As   String   =   " www.stats.gov.cn "
    
Private  gGovernmentDataIssueAddress  As   String   =   " http://www.stats.gov.cn/tjbz/xzqhdm/ "
    
Private  gExcelQueryTableWebTableIndex  As   Integer   =   9


    
Public   Property  GovernmentDefaultAddress()  As   String
        
Get
            
Return   Me .gGovernmentDefaultAddress
        
End   Get
        
Set ( ByVal  value  As   String )
            
Me .gGovernmentDefaultAddress  =  value
        
End   Set
    
End Property

    
Public   Property  GovernmentDataIssueAddress()  As   String
        
Get
            
Return   Me .gGovernmentDataIssueAddress
        
End   Get
        
Set ( ByVal  value  As   String )
            
Me .gGovernmentDataIssueAddress  =  value
        
End   Set
    
End Property

    
Public   Property  ExcelQueryTableWebTableIndex()  As   Integer
        
Get
            
Return   Me .gExcelQueryTableWebTableIndex
        
End   Get
        
Set ( ByVal  value  As   Integer )
            
Me .gExcelQueryTableWebTableIndex  =  value
        
End   Set
    
End Property

    
Public   Shared   ReadOnly   Property  DefaultInstance()  As  NetCurrentInformations
        
Get
            
Return   New  NetCurrentInformations
        
End   Get
    
End Property

End Class

取查询日期对应的版本日期,VersionDateList.vb

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

    
Private   Sub   New ()
    
End Sub

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

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

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

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

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

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

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


    
Public   Shared   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   Shared   Sub  Clear()
        gList.Clear()
    
End Sub

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

End Class

方案中有些过程需要验证有效性或花时较长,需要给用户信息和进度提示,定义两个委托:
一是ServiceMessageHandler.vb,

Public   Delegate   Sub  ServiceMessageHandler( ByVal  sender  As   Object ByVal  message  As   String )

二是ServiceProgressPercentHandler.vb,

Public   Delegate   Sub  ServiceProgressPercentHandler( ByVal  sender  As   Object ByVal  currentPercent  As   Integer )

用接口来明确任务的分工和实现。三个接口定义,请留意它的参数和返回结果,已具体化:
数据库(也就是RegionalCodeLibary项目)提供的服务,IServerServices.vb,

 

Namespace  [ Interface ]
    
Public   Interface  IServerServices
        
Event  ServiceMessage  As  ServiceMessageHandler
        
Event  UpdateDatabaseCurrentPercent  As  ServiceProgressPercentHandler

        
' '' <summary>
         ' '' 更新数据
         ' '' </summary>
         ' '' <param name="tableCollection">数据集合</param>
         ' '' <remarks>更新时到tableCollection的DataSet</remarks>
         Sub  UpdateDatabase( ByVal  tableCollection  As  Database.UpdateDatabaseDataSet)

        
' '' <summary>
         ' '' 取当前数据版本集
         ' '' </summary>
         Function  GetDataVersionTable()  As  Database.dsRegionalCode.VersionsDataTable

        
' '' <summary>
         ' '' 取区划码信息
         ' '' </summary>
         ' '' <param name="regionalcodeDate">查询日期</param>
         ' '' <remarks>如无数据,表名为Empty,否则为数据版本日期</remarks>
         Function  GetAllInformationsTable( ByVal  regionalcodeDate  As   String As  Database.dsRegionalCode.AllInformationsDataTable

    
End Interface
End Namespace

 用户需要为数据库提供可更新的数据,IClientProvideServices.vb,

 

Namespace  [ Interface ]
    
Public   Interface  IClientProvideServices
        
Event  ServiceMessage  As  ServiceMessageHandler

        
ReadOnly   Property  NetDownloadInformationsTable()  As  Database.dsNetDownload.DownloadInformationsDataTable
        
ReadOnly   Property  NetRegionalCodeTableDictionary()  As  Dictionary( Of   String , Database.dsNetDownload.RegionalCodeDataTable)

        
Sub  DownloadNetDataVersions()
        
Sub  DownLoadNetRegionalCodeDatas( ByVal  versionDate  As   String )

    
End Interface
End Namespace

用户需要用到的服务,IClientUseServices.vb,

Namespace  [ Interface ]
    
Public   Interface  IClientUseServices
        
Function  IsSameDataDate( ByVal  queryDataDate  As  DateTime,  ByVal  currentDataDate  As   String As   Boolean
        
Function  GetAllInformationsTable( ByVal  queryDataDate  As  DateTime)  As  RegionalCodeCommon.Database.dsRegionalCode.AllInformationsDataTable
        
Function  GetVersionsDataTable()  As  RegionalCodeCommon.Database.dsRegionalCode.VersionsDataTable
    
End Interface
End Namespace

由于是先“设计”再写代码的,可能写代码过程中想法有所改变,需要调整。 

下一篇,行政区划程序的设计(十一),RegionalCodeCenter项目的编码,IServerServices的实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值