Author:水如烟
总目录:行政区划数据方案设计
上一篇,行政区划程序的设计(十四),代码的整理。
在上面的代码整理中,由于引入了泛型类DataTableCollection,使我在处理相同结构的表的集合时方便顺畅多了。
从这篇开始,我打算用两篇来说说获取区划代码信息功能的实现。
由于要实现离线查询,实现起来并不是很简单的事。
先重温一下这个流程:
再具体一些,就是这样:
这一篇,说的是右边的“查询对应版本数据”。下一篇说左边的流程。
与上面实现数据更新功能类似,为了保存数据到本地,先继承DataTableCollection建立两个类,一个是RegionalCodeDataSet,存从服务器查询到的区划信息;另一个是VersionDateDataSet,存从服务器查询到的版本信息。
由于DataTableCollection只针对唯一结构的DataTable进行处理的,所以只能这样,建两个。
这篇的代码都是在RegionalCodeCommon项目上实现。
RegionalCodeDataSet.vb
Public Class RegionalCodeDataSet
Inherits LzmTW.uSystem.uData.DataTableCollection( Of dsRegionalCode.AllInformationsDataTable)
End Class
End Namespace
VersionDateDataSet.vb
由于只有一个版本集,DataSet里头最多只能有一个DataTable。数据的追加是对表的追加。因此需做处理
类DataTableCollection追加数据的原代码如下
' '如果已存在,则去除
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),即
' 如果已存在,则去除
Dim tmpTableName As String = table.TableName
Remove(tmpTableName)
gDataSet.Tables.Add(table)
gTableNameList.Add(tmpTableName)
End Sub
现在可以编写VersionDateDataSet.vb,
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,基本属性
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,用来获取查询日期对应的版本日期,我已由静态类改为实例类。
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,本地数据
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,查询
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。