win8_64bit系统下利用ODBC连接自建数据源时的问题与解决
背景:
由于用Labwindows/CVI做上位机开发的时候要用到访问数据库的功能,而CVI自带的SQL Toolkit Library提供的方法是基于ODBC的,所以尝试为其配置ODBC来访问Access数据库
平台:
Labwindows/CVI 2010,应该是32位版的
win8 64bit 企业版
Microsoft Access 2013(64位)
我的步骤:
1.建立数据源。利用Access自建一个数据源(table),保存为“.mdb”格式;
2.代码实现连接并访问数据源。利用CVI的SQL Toolkit Library提供的标准方法来完成,即依次调用DBConnect()->DBBeginMap()->DBMapColumnTo*()->Feching function...(各函数的参数省略,*代表若干可选项),具体实现可参考CVI的SQL Toolkit Help文档;
3.在操作系统中注册数据源。由于Windows采用ODBC的方式为应用程序提供统一的数据库访问接口,屏蔽不同数据库之间的差异,因此在使用基于某一种数据库创建的数据源之前,必须在ODBC数据源管理器中进行注册(即添加)。
问题与解决过程:
主要问题出现在第三步中,下面开始详细讨论。
首先在win8的搜索框中输入“ODBC”,打开ODBC数据源管理器(ODBC Data Source Administrator),这里要注意,以这种方式打开的数据源管理器是64位的(可以看到管理器的标题栏上有个括号里面写着 64位,如下图)。另外说明一下,我的win8一开始安装的是32位的office2010,因此此时在64位的ODBC管理器中找不到“Microsoft Access Driver”(点击“添加”后,列表中没有),因此也就无法注册我们自建的“.mdb”文件。
(当时在网上搜到可以打开C:\Windows\SysWOW64\odbcad32.exe这个32位的ODBC管理器完成注册,但我没有尝试,所以无法确定是否可以用32位的ODBC管理器在64位系统中找到32位的数据库驱动)
接下来我就卸载了32位的office,并安装了64位版的office2013。然后依然打开64位的ODBC管理器,在“系统DSN”选项卡下点击“添加”,终于看到了“Microsoft Access Driver“。
- 用该”Microsoft Access Driver“顺利地添加了我自建的Access数据源,如下图所示”CVI mytest“,可以看到该数据源的”平台“一项显示”64位“。
- 回到CVI开发环境中编译运行程序,结果出乎意料的又报错了:
- 错误提示是”驱动程序与应用程序之间的体系结构不匹配“,分析原因可能是我的CVI是32位的,而我创建的数据源使用的是64位的驱动,因此造成了体系结构不匹配。于是想到了位于C:\Windows\SysWOW64\odbcad32.exe下的32位ODBC管理器,若在该管理器下为数据源注册32位的驱动或许就可以了。
- 打开32位ODBC管理器(注意标题栏显示32位),如下图:
- 在“系统DSN”选项卡下点击“添加”,可以看到”Microsoft Access Driver“:
- (比较32位管理器和64位管理器下的Driver,可以发现,它们的版本号和动态链接库都不一样,如下图所示)
- 继续完成创建,可以看到我所创建的”CVImydatabase“的”平台“已经变成了32位:
- 回到CVI中,将程序链接的数据源改成”CVImydatabase“,运行成功,说明这种方法确实建立上了数据库的链接。
- 总结:
- 在64位操作系统下编程进行数据库访问时,应用程序与数据库驱动程序的体系结构应该要匹配,若安装的数据库(仅以Access为例)是64位的,则应该在32位的ODBC管理器下注册数据源,这样加载的才是32位的驱动程序。
- 若安装的数据库是32位的,在64位的ODBC管理器下是找不到对应的驱动的,在32位的ODBC管理器下是否能找到驱动,若能找到注册数据源后能否成功实现链接,这两个问题由于我没有测试,所以现在还不能确定。