在LabVIEW中动态配置ODBC数据源
1 前言
ADO作为Microsoft开发数据库应用程序的最新接口,是一种提供访问各种数据类型的连接机制。由于它提供了比 DAO和RDO更加灵活的技术和更为广泛的应用,各种高级语言都用它来编制数据库应用程序。LabVIEW作为目前最流行的虚拟仪器开发工具之一,通过ActiveX控件技术来支持利用ADO技术来访问数据库,较之价格昂贵的SQL ToolKit for LabVIEW和编程复杂的DLL,ADO技术是LabVIEW访问数据库最理想的方式,它不仅编程简单,而且支持多种类型的数据库。
ADO是通过DSN(数据源名)来访问数据库的。DSN是应用程序用以请求一个连到ODBC数据源的连接(CONNECTION)名字,它隐藏了诸如数据库文件名、所在目录、数据库驱动程序、用户ID、密码等细节。当建立一个连接时,不用去考虑数据库文件名、路径等等,只要给出它在ODBC中的DSN即可。因此,在使用ADO访问数据库前,先要配置ODBC数据源,即建立DSN与数据库文件名、所在目录、数据库驱动程序、用户ID、密码之间的对应关系。在一般情况下,可以用Windows系统下ODBC数据源管理器手动完成ODBC数据源的配置。可是,当改变数据源位置或者要将程序(包含数据源)安装到其他计算机上时,必须重新配置ODBC数据源,这样做不仅麻烦,而且给用户使用应用程序带来了困难。在一些高级语言中(如VB,C++)可以通过数据库引擎或在注册表中创建ODBC数据源键值的方法来实现ODBC数据源的自动配置。由于LabVIEW中没有提供数据库引擎或者类似的工具来完成ODBC的动态配置,因此第一种方法不能实现;第二种方法,虽然在LabVIEW中可以实现,但是无论是用VC编写相关的DLL供LabVIEW调用还是直接用LabVIEW提供的注册表操作函数创建键值,都会带来相当复杂的编程,而且还要求编程人员熟知注册表的相关知识,这些对编程人员来说是一个负担。
下面我们介绍怎样通过导入注册表文件并修改部分键值的方法来实现ODBC数据源动态配置,这种方法较之前面两种不仅可行而且编程简单,对注册表的知识也没有很高的要求。
2 导入注册表文件,动态配置ODBC数据源
不难发现,手动配置ODBC数据源实际上是将数据源的相关信息写入注册表,而应用程序又是通过注册表中的相关信息来访问数据源的。因此,只要将与手动配置相似的注册表信息导入到注册表中,并由程序控制注册表中的相关内容,就可实现ODBC数据源的动态配置。在LabVIEW中实现注册表的导入和修改并不是一件很困难的事,因此用这种方法进行其动态配置ODBC数据源是极为方便的。具体步骤如下:
第一步:准备要导入注册表的注册表文件(在这之前要完成手动配置ODBC 数据源)。
(1)运行注册表编辑器,导出【HKEY_LOCAL_MACHINE/SOFTWARE/ ODBC/ODBC.INI/ ODBC Data Sources】关键字到tmp1.reg中。如果数据源为用户数据源,则导出【HKEY_CURRENT_USER SOFTWARE/ODBC/ODBC.INI/ODBC Data Sources】关键字。
(2)导出数据源的注册表信息到tmp2.reg中。假设手动配置的ODBC数据源名为”demo”,则导出的是【HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/demo】关键字。
(3)合并上述两个注册表文件。用记事本打开tmp1.reg 和tmp2.reg,将两个文件中的注册表信息合并为一个注册表文件,另存为dsn.reg (保存在程序所在目录下)。本例合并后的dsn.reg内容为:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/ODBC Data Sources]
"demo"="Driver do Microsoft Access (*.mdb)"
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/demo]
"Driver"="C://WINDOWS//system32//odbcjt32.dll"
"DBQ"="F://demo.mdb"
"DriverId"=dword:00000019
"FIL"="MS Access;"
"SafeTransactions"=dword:00000000
"UID"=""
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/demo/Engines]
[HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/demo/Engines/Jet]
"ImplicitCommitSync"=""
"MaxBufferSize"=dword:00000800
"PageTimeout"=dword:00000005
"Threads"=dword:00000003
"UserCommitSync"="Yes"
(4)修改dsn.reg。对于特定的数据源来说,要动态配置的项只有“DBQ”和“Driver”关键字。“Driver”指明ODBC驱动程序的位置。ODBC驱动程序(本例为odbcjt32.dll)一般在系统目录下的system32目录中,所以将dsn.reg中的“Driver”键值改为”%systemroot%//system32//odbcjt32.dll”,即可实现驱动程序的动态配置。“DBQ” 项标识数据源的存放路径,在程序运行时,获得数据源存放数据路径后确定其键值,即可实现“DBQ”的动态配置。这里我们给“DBQ”键值为空值,待程序运行时在确定其值。修改后的“Driver”和“DBQ”为:
"Driver"="%systemroot%//system32//odbcjt32.dll"
"DBQ"=" "
其他项不发生改变。至此,准备工作完毕。
说明:本例中所使用数据库为Access数据库。对如不同的数据库驱动程序可能会有所不同,在手动配置时系统会根据数据源的类型自动选择适合的驱动程序。在确定“Driver”的键值时应注意驱动程序。
第二步:导入注册表信息和修改“DBQ”关键字键值。
在命令提示符下,执行“regedit /s dsn.reg”可以将dsn.reg“静态”导入到注册表中。在LabVIEW中执行相同的命令也能将dsn.reg导入到注册表中。【Function】→【communication】→【system exec.vi】可以执行各种命令,它的“command line”参数指定要执行的命令。【Function】→【Advanced】→【Windows Registry Access VIS】下提供各种各样的注册表操作函数,利用他们可以方便的创建,修改,查询,删除注册表项。具体用法可以参看 LabVIEW的帮助文档和实例。下面给出LabVIEW中导入注册表和修改“DBQ”关键字键值的程序框图如图1所示:
图1 动态配置VI
(图中红线框部分获取数据源所在路径,也可以通过文件对话框来获得数据源路径)
把这个VI 作为子VI在每次程序初始化时调用,即可实现ODBC 数据源的动态配置。为了证明这个方法的正确性,我们编写如下图2这个VI 来验证:
图2 动态配置VI的应用实例
框图中动态配置子VI即为图1编写的动态配置VI。若把包含程序和数据源的目录移动到磁盘中的其他目录或者另一台没有配置ODBC数据源的系统上,程序仍能够没有异常地运行。本例在WinXP+LabVIEW 7.1,Win2000+LabVIEW7.0上运行通过。
3 结论
实例运行结果表明,程序能正确找到ODBC数据源,这说明用该方法能实现动态配置 ODBC数据源。与编写DLL和创建键值实现动态调用相比,导入注册表文件的方法编程简单,操作方便。通过导入注册表文件再修改部分键值,不失为LabVIEW中实现动态配置ODBC数据源的一种理想方法。