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

Author:水如烟

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

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


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

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

Namespace  uSystem
    
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(不知怎么取名好)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值