现在的位置: 首页 > 综合 > 正文

SQLServer数据库上身份证转换的ActiveX实现

2014年02月17日 ⁄ 综合 ⁄ 共 6101字 ⁄ 字号 评论关闭
    摘  要 微软的MS SQLServer是国内主流的数据库平台之一,15位身份证与18位身份证的转换是很多基于数据库管理的信息系统所遇到的一个常见问题,本文采用VB开发了一个身份证转换的Active-X组件,并利用SQL Server对OLE自动化技术的支持,将这个组件扩展为一组SQLServer的自定义函数,使得信息系统可在数据库一级实现对身份证号码转换的支持。
    关键词 ActiveX组件;数据库;身份证号码转换

 

1  引言

    在大多数利用数据库的管理信息系统中,涉及到人员资料管理的时候,多数会记录身份证信息,而且身份证号码往往被作为所在表的关键字段(主键、外键、惟一索引等)使用,用以检索相关业务的惟一性,因此,对这类信息系统而言,身份证号码惟一的重要性不言而喻。在我国,1999年以前使用的是15位的身份证,而1999年后,对身份证进行了升位,由15位变为18位。升位的规则是将15位身份证中的年份代码由2位升级为4位,并在尾部增加一位校验码。对相当多的信息系统而言,身份证升位后,面临一个类似的技术需求,即如何处理这两种身份证号码的惟一性。也就是说,每个15位号码有一个对应的18位号码,虽然在数据库层两个号码不重复,但是在业务上,两个号码是一致的。
    从技术实现的角度来看,最好的解决方案是一次性将系统中的所有15位身份证转换为18位身份证,以后全部使用18位身份证号码办理业务。而根据18位身份证号码的规则,其实现手段并不复杂。但是放到业务层面,很多信息系统并不允许这样做,以电子档案系统为例,大多数业务都要求系统内的数据需如实反映纸质档案的原始情况,除非纸质档案发生改变。笔者在以前实施过的一个房地产档案管理系统中,就遇到这类业务要求。对于房地产权属证明书中的权属人资料,必须以原有纸质档案文件中的号码为准。而当市民利用18位身份证号码去办理业务的时候,系统又需要能找出其原有15位身份证所对应的业务信息。因此,当业务上需要同时在数据库中保留两种格式的身份证,同时又必须在业务上判断惟一性的时候,技术处理的手段就非常重要了,目前,绝大多数的系统都是采用客户机/服务器模式,因此,很多系统将身份证转换的处理放到了客户机上实现。
    在客户机上实现这种功能无疑会带来系统的复杂性,以在一个数据表(假设为TableA)中判断身份证字段(假设为ID)是否存在某一个号码id为例,客户机程序首先需要将号码id转为两个版本的身份证号码:id15,id18,然后用以下逻辑判断数据表中是否存在这个号码:
    Select count(*)from TableA where ID in(id15,id18)
    另外一种解决思路是在服务器端(例如在数据库层)完成转换。利用数据库的自定义函数功能,开发者按照身份证的号码转换规则编写自定义函数实现该功能,使得在数据库一级支持身份证的号码转换。由于大多数关系型数据库都支持扩展的结构化查询语言(SQL),可利用这些语句创建自定义的函数或存储过程[1]。但是,SQL的语法较为简单,且支持的内部变量的数据类型较少(例如,不支持数组及其操作),操作数据表效率尚可,对于复杂的算术及逻辑运算的支持能力就较差,强行要实现,程序的效率也会十分低下。
    但是从效率的角度来看,在数据库层实现身份证号码转换的思路无疑比在客户端实现要好,关键是如何提高数据库层实现的灵活性及效率。在应用中,我们发现,大多数关系型数据库都支持外部的功能扩展,以在国内信息系统中使用最为普遍的关系数据库MS SQLServer为例,不仅支持外部存储过程的扩展方式,还支持OLE自动化方式的扩展,因此,本文介绍用一个用VB实现的身份证Active组件,然后利用SQLServer对OLE自动化技术的支持,将该组件改造为一组SQLServer上的自定义函数,以实现数据库层面的身份证号码转换。本文的实现适用于MS SQLServer 2000以后的所有版本。

2  身份证号码转换的ActiveX实现

2.1  身份证号码规则简介

    在我国,身份证存在两个版本,早期的15位长,称为第一代身份证,现在使用的是第二代身份证,18位长,根据1999年公布的中华人民共和国国家标准GB11643-1999中有关身份证号码的规定,第二代身份证号码是特征组合码,由17位数字本体码和1位数字校验码组成[2],两代身份证之间的结构及差别主要反映在出身日期码的长度及数字校验码上,假设一个出生于1982年1月1日,户口所在地在广州市天河区的男性公民,其两代身份证号码的结构可能如图1所示。

图1  身份证号码结构

 

    可以看出,两代身份证的数字本体码区别不大,主要是出生日期的年份长度有别,区别主要在于第二代身份证多了一个校验位,根据GB11643-1999中的规定,身份证的校验位是根据身份证的前17位数字本体码,按照ISO 7064:1983.MOD 11-2算法计算出来的,其算法逻辑如下[3]
    (1)首先计算十七位数字本体码的加权和。
    S= Sum(Ci × Wi),其中,
    i-代表由右至左17位数字本体码的位置序号,i = 0,...,16;
    Ci-代表第i位置上的身份证号码字符值;
    Wi-代表第i位置上的权值,其取值为Mod(2 i-1,11);
    (2)计算模。
    M=Mod(S,11)
    (3)计算校验位。
    Y=Mod(M+11-3,11),如果Y=10,校验位为X,其余为Y值字符。

2.2  身份证号码转换ActiveX组件

    根据身份证编号的规则,不难设计一个进行身份证号码转换的程序[4],本文利用Visual Basic 6.0实现一个ActiveX组件完成身份证号码的转换。下面简单介绍一下该组件的实现过程。
    首先在VB中创建一个Active DLL类型的工程[5],工程名称命名为IDConversition,然后建立一个名为IDConvert的类,输入如下代码:
   
上面程序中,方法:
    (1)ID18:公有方法,将15位身份证转换为18位身份证;
    (2)ID15:公有方法,将18位身份证转换为15位身份证;
    (3)calcVerify:私有方法,计算17位数字本体码的校验位,由ID18调用;
    编译该程序,可得到一个名为IDConversition.dll的Active DLL组件,我们将该文件复制到SQL Server服务器所在机器,在命令行下运行下面的命令注册该组件。
    Regsvr32 IDConversition.dll
    组件的包名为IDConversition,类名为IDConvert。完成了这一步,就可以准备在SQLServer中利用这个ActiveX组件了。

3  SQLServer对OLE技术的支持

    微软公司由SQLServer 2000版开始,增加了对通过使用组件对象模型(COM)自动化语言(如 Microsoft Visual Basic 或 Microsoft Visual C++)创建组件库的办法来扩展自定义函数的支持。可以在SQLServer中注册这些组件库,并定义为自定义函数,以后在Transact-SQL(TSQL)中使用这些自定义函数。这一技术可使我们大大扩展SQLServer在服务端的能力。
    SQLServer对OLE技术的支持是通过一组系统存储过程来实现的[6],基本过程如下:
    (1)调用 sp_OACreate 创建OLE对象。
    (2)使用该对象。
    ①调用 sp_OAGetProperty 获取对象属性值。
    ②调用 sp_OASetProperty 将对象属性设为新值。
    ③调用 sp_OAMethod 以调用对象的某个方法。
    ④调用 sp_OAGetErrorInfo 获取错误信息。
    (3)调用 sp_OADestroy 释放对象。
    下面,本文将展示如何在SQLServer中将前述的ActiveX组件转换为用户自定义函数。

4  身份证转换自定义函数

    由于在组件IDConversition.dll中。我们定义了两个公有方法ID18、ID15分别进行15至18位身份证转换及18至15位身份证转换,因此,我们将在SQLServer上创建两个自定义函数fnID18、fnID15分别对应组件IDConversition.IDConvert的上面两个方法,限于篇幅,本文将仅给出函数fnID18的主要代码:
    一旦完成上述定义,则可以像使用SQLServer中其它函数对象一样使用该自定义函数对象,如将15位身份证id15转换为18位,可以使用TSQL命令:
    Select dbo.fnID18(id15)
    将18位身份证id18转换为15位,可以使用TSQL命令:
    Select dbo.fnID15(id18)
    而像本文最开始的例子中,在一个数据表(假设为TableA)中判断身份证字段(假设为ID)是否存在某一个号码id(假设是18位号码),可以使用TSQL命令:
    Select count(*)from TableA where dbo.fnID18(ID)=id

5  结束语

    SQLServer的OLE自动化存储过程扩展技术,大大拓展了SQLServer的服务端开发能力,很多利用TSQL语句很难处理的数据逻辑都可以通过VB、VC++的强大编程技巧予以实现,同时,VB、VC++的组件开发者也可充分利用其技术积累,将许多ActiveX组件移植到SQLServer数据库中以扩展数据库的功能。

参考文献

    [1] 胥永康,潘泽友,岳筱玲。公民身份号码升位在Sybase数据库上的实现[J]. 计算机工程,2002,8(Vol.28,No.8):249-254
    [2] GB11643-1999. 公民身份号码[S]. 国家标准
    [3] ISO 7064:1983.MOD 11-2校验码[S]. 国家标准
    [4] 吴兆福. 身份证巧位至18位转换的C函数设计与实现[J]. 电脑学习,2006,10(5):60-61
    [5] 李鸿吉编著. Visual Basic高级编程技术[M]. 北京:科学出版社,2003年1月  
    [6] 微软公司. SQL Server 2000联机从书[CD],2000
    收稿日期:1月13日    修改日期:2月9日
    作者简介:孙璐(1968-),男,江苏镇江,硕士,讲师。主要研究方向:电子政务应用、数据库技术。

抱歉!评论已关闭.