Author:水如烟
总目录:行政区划数据方案设计
上一篇,行政区划程序的设计(六)
在编写RegionalCodeLibary项目前,先将前面的分析“成果”总结下来。
LzmTW项目:
八位日期字符串与日期的转换函数
文件uString.vb,
Public Class uString
Private Sub New ()
End Sub
' '' <summary>
' '' 日期转八位字符串
' '' </summary>
' '' <param name="date">日期</param>
' '' <remarks>如2006-9-28转换为20060928</remarks>
Public Shared Function GetDateString( ByVal [ date ] As DateTime) As String
Return [ date ].ToString( " yyyyMMdd " )
End Function
' '' <summary>
' '' 八位字符串转日期
' '' </summary>
' '' <param name="dateString">八位字符串</param>
' '' <returns></returns>
' '' <remarks>如20060928转换为2006-9-28</remarks>
Public Shared Function GetDate( ByVal dateString As String ) As DateTime
Return CType (ToDateFormat(dateString), DateTime)
End Function
' 将八位字符串转换为日期字符串格式,如20060928转换为2006-09-28
Private Shared Function ToDateFormat( ByVal dateString As String ) As String
Return System.Text.RegularExpressions.Regex.Replace(dateString, " /b(/d{4})(/d{2})(/d{2})/b " , " ${1}-${2}-${3} " )
End Function
End Class
End Namespace
RegionalCodeCommon项目:
数据集(这可以在IDE上用拖放的形式来建)
(代码略)
接口
文件IAction.vb(不知怎么取名好)
Function IsSameDataDate( ByVal queryDataDate As DateTime, ByVal currentDataDate As String ) As Boolean
Function GetAllInformationsTable( ByVal queryDataDate As String ) As dsRegionalCode.AllInformationsTableDataTable
End Interface
RegionalCodeApplication项目:
UserControlQueryBase控件
文件UserControlQueryBase.vb(代码略)
所有项目的编译环境,Option Strict设为ON。
现在的方案组织如下:
现在说RegionalCodeLibary项目的编写。
一个项目的编写,我的理解,由两部分组成,一是分析,二是编码。公用类的项目只需关心合理组织就可以了,具体项目还是要分析的。
上文中曾对RegionalCodeLibary的作用作了分析:它负责与数据库直接打交道,不依赖任何其它项目。它对外提供版本数据的更新;输出信息视图(一个DataTable)两个功能。
输出信息视图很简单,只需定义一个函数就够了。
FUNCTION ProvideAllInformations(ByVal regionalCodeDate As String) As DataTable
参数regionalCodeDate为八位日期字符串,也就是存储过程“[Program].[行政区情况]”的“@当前时间”所需要的值。
现在看提供版本数据更新这个服务,如何定义这个函数。
注:在这里,要完全抛开原来已建的那个方案,就是那个现在还在提供下载的,关于How To:利用Excel的QueryTable下载网上数据 的示例方案。那个方案只是测试一种方法是否可行随意建立起来的。
因为是直接与数据库打交道,必然的要联系数据库的特点,看数据库本身对外提供的服务。
在建立数据库时我曾提到,数据库中,只有命名空间为[Program]的才对外服务,所以,除了存储过程“[Program].[行政区情况]”,就只有“[Program].[增添记录] @区划码, @名称, @起始日期”了。而这个本身也是用来更新数据的。
现在,依据这个存储过程,初步定义函数如下:
SUB ProvideAddRecord(ByVal code As String, name As String, initialDataDate As String)
这是一个记录一个记录更新,速度肯定“慢”,可数据库提供的服务本身已经决定了。是否还可以提高?
重新审视数据库。
SQLServer2005提供了一种数据类型xml,如果外部向它提供合适的xml数据,那么,完全可以以数据集为参数来更新数据库。只是,我现在还不曾用过xml类型,不熟悉。所以将且用单行更新的方法,以后再改进。
这里提到数据集的概念,是否可以利用?是可以的。外部可以对这个项目提供DataTable,遍历更新。函数可重构(重新构造的意思,并非是术语的重构)为
SUB ProvideUpdateDatabase(ByVal table As DataTable)
有严格格式的xml数据可以转换为一个DataTable。因此,为了以后升级方便(以后在数据库我可能利用xml数据类型了),重新将函数定义为
OVERRIDABLE SUB ProvideUpdateDatabase(ByVal table As DataTable)
分析到了这里,还要考虑一些数据安全、完整性等问题。
是否需要事务来保障?
从[Program].[增添记录]运行过程的特点,可以不考虑事务,如果执行过程中中断了,重新更新对应版本的数据就可以了。
说到版本数据,又联系到数据的来源。它在网上,有多个版本。无论是用ExcelQueryTable还是别的方法来取得数据,这个过程,都希望将全部版本的数据一次下载下来,然后一次更新到数据库中去,这样,它的数据集是多个DataTable了。函数是可以接受这个数据集的。重构如下:
OVERRIDABLE SUB ProvideUpdateDatabase(ByVal ds As DataSet)
还有,在设计数据库时我曾提到,全部数据中有一个最早的起始日期。如果查询早于这个“最早起始日期”的信息,是找不到的。因此,还要有一个功能,或者说还要对外提供一项服务,是定义最早的起始日期的。
SUB PovideSetFurthestDataDate(ByVal datadate As String)
我并不想在程序里利用Sql语句来实现这个功能,所以,还需要在数据库上建立这个存储过程。建这个存储过程时,就需要使用事务了。
到了这里,总结有如下函数:
FUNCTION ProvideAllInformations(ByVal regionalCodeDate As String) As DataTable
OVERRIDABLE SUB ProvideUpdateDatabase(ByVal ds As DataSet)
SUB PovideSetFurthestDataDate(ByVal datadate As String)
数据库还要建立一个存储过程。
(英文掉光了,用时很是难受)
说了一大通,还有的:
项目环境的考虑。
方案中数据服务器、数据库名称非指定的,用户登录方式也有两种。
现在可以告一段落了。
下一篇,行政区划程序的设计(八),RegionalCodeLibary项目的编码。