设计行政区划程序的内容介绍

设计行政区划程序的内容介绍

Author:水如烟

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

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


在编写RegionalCodeLibary项目前,先将前面的分析“成果”总结下来。

LzmTW项目:
八位日期字符串与日期的转换函数
文件uString.vb,

NamespaceuSystem
PublicClassuString

PrivateSubNew()
EndSub

'''<summary>
'''日期转八位字符串
'''</summary>
'''<paramname="date">日期</param>
'''<remarks>如2006-9-28转换为20060928</remarks>
PublicSharedFunctionGetDateString(ByVal[date]AsDateTime)AsString
Return[date].ToString("yyyyMMdd")
EndFunction

'''<summary>
'''八位字符串转日期
'''</summary>
'''<paramname="dateString">八位字符串</param>
'''<returns></returns>
'''<remarks>如20060928转换为2006-9-28</remarks>
PublicSharedFunctionGetDate(ByValdateStringAsString)AsDateTime
ReturnCType(ToDateFormat(dateString),DateTime)
EndFunction

'将八位字符串转换为日期字符串格式,如20060928转换为2006-09-28
PrivateSharedFunctionToDateFormat(ByValdateStringAsString)AsString
ReturnSystem.Text.RegularExpressions.Regex.Replace(dateString,"/b(/d{4})(/d{2})(/d{2})/b","${1}-${2}-${3}")
EndFunction
EndClass

EndNamespace
 


RegionalCodeCommon项目:
数据集(这可以在IDE上用拖放的形式来建)
(代码略)

接口
文件IAction.vb(不知怎么取名好)

PublicInterfaceIAction
FunctionIsSameDataDate(ByValqueryDataDateAsDateTime,ByValcurrentDataDateAsString)AsBoolean
FunctionGetAllInformationsTable(ByValqueryDataDateAsString)AsdsRegionalCode.AllInformationsTableDataTable
EndInterface


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项目的编码。