随着电脑在企业的普及,企业使用的业务处理软件越来越多。在企业使用软件的初期,各业务系统是彼此独立的,随着企业信息化建设的提高,各种应用软件的数据资源共享便成了一个急需解决的问题。考虑到成本等因素,不可能推翻旧系统,全部重新规划。于是,通过文件型数据库进行数据交换便成为目前一种流行的处理手段。
虽然XML为数据交换提供了一种标准和发展方向,但是目前进行数据交换多数采用的还是文本文件、EXCEL电子表格文件、VFP(.DBF)、ACCESS数据库文件。所以,编写一个可以将业务数据导成指定类型文件的通用类,还是比较有意义。下面我们用VB来实现一个导出SQL Server数据的通用类。
打开VB,新建一个“标准EXE”,菜单中选择“工程-->添加类模块”,选择“VB类生成器”,打开进入VB的类生成器。
一、 类的属性及方法定义
在类生成器中,添加如左表所示的类、属性及方法:
添加一个名为“在类生成器中,一个名为“Export SQL Server”的新类,这是我们导出SQL Server的类要包含的信息,在该类中添加如左表所示内容:
二、 要解决的问题
为了实现通用的导入/导出,我们要解决以下几个问题:
1) 处理效率:不能采用逐条处理的方法,那样处理虽然简单,但效率很低;
2) 文件位置:因为文件数据由客户端程序操纵,所以无论是导入,还是导出,数据文件都必须在客户端上,而不能在SQL服务器上;
3) 文件创建:对于导出数据,因导为不可能事先知道要导出的数据源的表结构,因此得考虑如何根据源数据表结构,创建目标表结构的问题。
三、 问题分析
首先考虑效率的问题,在程序中实现对数据库的处理,都是使用数据库对象来操作,然而,数据库对象并不提供两个数据对象之间的直接数据交互功能,只能逐
条处理,所以我们不能采用数据库对象直接实现数据的导入/导出。而在数据库中,实现表之间的数据导入/导出直接用SQL语句就可以搞定,而且处理也是批量处理,所以最有效的方法是在数据库中直接实现导入/导出,这就要求我们找一种数据库,这种数据库能访问我们导入/导出处理涉及到的所有数据库类型,很显然,ACCESS和SQL Server都符合我们的要求。
再来考虑文件位置的问题,虽然SQL Server中提供了openrowset、opendatasource、链接服务器让我们直接与其它类型的数据库之间交换数据,但由于SQL Server是服务型数据库,它的所有SQL语句都是在SQL Server服务器上执行,因此它访问的文件型数据库也是基于SQL Server服务器上的,但我们要求导入/导出处理的文件型数据库在客户端,所以我们不能直接用SQL Server中的功能来实现导入/导出处理;而ACCESS数据库,它通过链接表的方式来访问其他类型的数据库,而且它操作的链接表对象的来源是基于调用它的客户端,这正是我们所需要的。我们只要利用程序创建链接表来操作导入/导出涉及到的源表及目标表就行了,当然前提是我们要找到程序中创建各种数据库对象链接表的方法,其实就是要解决连接字符串(Connection String)的问题。
最后一个是文件的创建问题,通过上面的分析,我们决定由ACCESS数据库作为导入/导出的中转站,因此我们只要按ACCESS数据库的处理方法分析链接表,就可以分析出导入的数据源的结构信息,而用DAO数据库对象也可以方便地创建各种文件型数据库及表对象(当然,也许我们会找到更好的方法),所以编写这个类的话,我们把DAO作为数据处理对象。在工程中添加DAO对象的引用:工程-->引用--> Microsoft DAO 3.6 ObjectLibrar。
四、 问题解决
1) 连接字符串(Connection String)的问题
如何得到连接字符串模板呢,我们做一个试验,打开ACCESS,新建一个ACCESS数据库,然后在菜单中,依次选择“文件-->获取外部数据-->链接表”,在出现的“链接”对话框中,文件类型选择“Microsoft Excel(*.xls)”,随便找一个Excel文件,按向导提示完成链接表的处理,这样在新建的ACCESS数据库中,就会产生一个链接到Excel的链接表。
接下来我们要得到它的Connection String,在菜单中,依次选择“插入-->模块”,进入模块编辑窗口,按Ctrl+G调出立即窗口,输入下面的语句:
debug.Print currentdb.TableDefs("第一步中生成的链接表名").Connect
这样我们就得到了创建Excel链接表的Connection String,同样的方法,我们可以得到其他数据库类型的Connection String;
2) 数据库文件创建的问题
在数据库中,用“SELECT ... INTO 目标表 FROM源表”的形式,是可以直接创建表的,如果我们能在ACCESS数据库中,直接这样来创建导出中的目标文件,那就省去了分析源链接表,创建目标数据文件的麻烦,所以用链接表的方式,还不是首选。
而在ACCESS数据库中,可以用“SELECT * FROM[Connection String].表名"的形式来直接访问非ACCESS数据库的,那么,是否能用“SELECT * INTO [Connection
String] FROM [Connection String].表名”呢,经过在ACCESS中的测试,完全可行,这样就省去了分析导入的数据来源结构的问题,轻松很多。
3) 通用类中涉及到的Connection String
根据不同的数据有所不同,也可根据VB中的向导工具生成连接字符串。
五、 补充说明
经过上面的分析,相信大家对于如何编写这个通用的类,心里都有了底,这里需要补充的是,ACCESS数据库不仅支持访问SQL Server数据库,也支持访问ORACLE、DB2 、SYBASE 这类的数据库,所以如果大家有兴趣的话,可以修改上面的类定义,使其更通用。