Author:水如烟
总目录:行政区划数据方案设计
上一篇,行政区划程序的设计(九)
从程序设计开始到完成了RegionalCodeLibary的编写,基本上对整个方案做到了“心中有数”。“虚”的把握了,现在要做的是把“虚”变成“实”。
在项目中,“虚”与“实”也逐步得到体现。基础类也向我们需要的实体类转化。
一般来说,到了应用层,数据类型需要要具体化,既是约束的需要,也是服务的必要。展现给用户的,信息是明确的,意思是明了的。
“虚”“实”转换的任务,就落在RegionalCodeCenter项目上。
而“实”的定义,实体类的定义,若是符合可移植范畴的,在RegionCodeCommon上定义。
下面,看看有哪些信息需要在RegionCodeCommon上明确下来。
项目组织:
数据集有三个:
一是数据库所提供的信息,dsRegionalCode.xsd,
二是用户提供给数据库更新用的信息,dsUpdateDatabase.xsd,
三是用户从网上获取的信息,dsNetDownload.xsd,
上面数据集在特定功能实现时的处理:
下载的数据,因为用时较长,考虑保存到本地,NetDownloadLocalDataSet.vb
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
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,
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
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,
二是ServiceProgressPercentHandler.vb,
用接口来明确任务的分工和实现。三个接口定义,请留意它的参数和返回结果,已具体化:
数据库(也就是RegionalCodeLibary项目)提供的服务,IServerServices.vb,
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,
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,
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的实现。