LabVIEWwilliam hill官网
直播中

AnsenYue

5年用户 4经验值
擅长:可编程逻辑 MEMS/传感技术 测量仪表
私信 关注

详解UDL文件创建数据库链接字符串

本帖最后由 AnsenYue 于 2020-2-18 11:40 编辑

今日再次被人询问,关于通过UDL文件创建Access数据库链接字符串时,发现无法找到Microsoft ACE.OLEDB.12.0的驱动,如何解决。

想想这个问题,太有普遍性和代表性,很多新手都在这个问题上吃过亏。再回想当年解决这个问题时,查询网上的解决办法,都是提供了解决方法,但并未提及这个问题产生的原因,问题被解决之后,大多处于”知其然不知其所以然“的状态,鉴于此,把这个问题的原因写出来,方便大家以后解决类似的问题,也为自己记录一下问题的解决思路,方便日后处理类似问题。

本文目录:
  • 问题的引出
  • 什么是UDL文件
  • 什么是OLE DB Provider
  • Provider驱动包含哪些数据库链接引擎
  • 什么是Microsoft JET Database Engine
  • Microsoft JET Database Engine安装须知
  • ACE Data Provider安装须知


文中涉及到引用资料的地方,我都会标注引用链接,方便你们自行查阅。
文中如有错误的地方,请指正,感谢!


问题的引出:


咨询人创建了一个2010版Access的数据库,想使用UDL文件来链接到该数据库,实现程序功能。在创建的过程中,按照惯例(经验害死人系列……)链接字符中的关键参数Provider想指定使用Micosoft.ACE.OELDB.12.0引擎,但创建UDL文件后发现,Provider列表并没有该引擎,虽懵逼。


UDL文件如下图:
udl截图.png

从图中可以看出,确实没有Microsoft.ACE.OLEDB.12.0。

-------------------------------------------------------------------------------------------------

什么是UDL文件


基本定义:
”udl(Universal Data Link)是通用数据连接文件,使用通用数据链接 (UDL) 文件来保存连接字符串。“

关键信息:
”Microsoft 数据访问组件 (MDAC:Microsoft Data Access Components) 提供“数据链接属性”对话框作为常用用户界面,以指定 Windows 2000 及更高版本操作系统上的数据提供程序的连接信息。可使用“数据链接属性”对话框将连接信息保存在通用数据链接 (.udl) 文件中。”(查看上面的UDL文件图片,可以看到“数据链接属性”标题)

本节信息来源:百度文库:UDL

-------------------------------------------------------------------------------------------------
什么是OLE DB Provider


“OLE DB separates the data store from the application that needs access to it through a set of abstractions that include the datasource, session, command, and rowsets. This was done because different applications need access to different types and sources of data, and do not necessarily want to know how to access functionality with technology-specific methods. OLE DB is conceptually divided into consumers and providers. The consumers are the applications that need access to the data, and the providers are the software components that implement the interface and thereby provides the data to the consumer. OLE DB is part of the Microsoft Data Access Components (MDAC) stack.“

说简单点就是第三程序访问数据库的系统组件。不多解释,不是本文重点。资料出处(Wikipedia英文:https://en.wikipedia.org/wiki/OLE_DB)

-------------------------------------------------------------------------------------------------

Provider驱动包含哪些数据库链接引擎

OLE DB Provider.png

图片看不清楚,有文字:

  • SQL Server OLE DB Provider,以SQL Server為主的OLE DB資料提供者。
  • Microsoft Jet OLE DB Provider,以Access, Excel, dBase等檔案型資料庫為主的OLE DB資料提供者。
  • OLE DB Provider for Internet Publishing,支援WebDAV(Web Distributed Authoring and Versioning)發布的OLE DB資料提供者。
  • OLE DB Provider for ODBC,呼叫ODBC的OLE DB資料提供者。
  • OLE DB Provider for Oracle Client,呼叫Oracle資料庫的OLE DB資料提供者,通常由Oracle原廠提供。
  • OLE DB Provider for Indexing Services,支援Microsoft Indexing Service索引庫的OLE DB資料提供者。
  • OLE DB Provider for Active Directory Services,支援Active Directory目錄資料存取的OLE DB資料提供者。
  • Microsoft OLE DB Persistence Provider,將資料集(Recordset)寫入檔案或由檔案讀取的OLE DB資料提供者。


红色部分的Provider是本文的重点,因为它是实现labview连接Access数据库要用到的引擎。(不光是LabVIEW,其它任何编程语言想通过UDL来链接Access数据库时一定会用到)
资料出处:(Wikipedia中文:https://zh.wikipedia.org/wiki/OLE_DB)

-------------------------------------------------------------------------------------------------

什么是Microsoft JET Database Engine

解释:
Microsoft Jet是微軟針對檔案型資料庫所發展的資料庫引擎(Database Engine),它的適用資料來源種類相當多,像是Microsoft Access、Microsoft Excel、dBase等等檔案型資料來源都可以利用Microsoft Jet資料庫引擎來使用SQL指令存取。
目前的Jet引擎最新版本為4.0,並且未來在x64平台上將不再支援。(晓得我为啥要把这里标红了嘛?晓得了嘛?)


版本历史:
Jet versionJet engineDLL file nameSupported database versions
1.0


1.0
1.1
1.10.0001
MSAJT110.DLL
1.0 / 1.1
2.0
2.00.0000
MSAJT200.DLL
1.0 / 1.1 / 2.0
2.5
2.50.1606
MSAJT200.DLL
1.0 / 1.1 / 2.0
3.0
3.0.0.2118
MSJT3032.DLL
1.0 / 1.1 / 2.0 / 3.0
3.5
3.51.3328.0
MSJET35.DLL
1.0 / 1.1 / 2.0 / 3.X
4.0 SP8
4.0.8015.0
MSJET40.DLL
1.0 / 1.1 / 2.0 / 3.X / 4.0
ACE 12
12.0.xxxx.xxxx
ACECORE.DLL
1.0 / 1.1 / 2.0 / 3.X / 4.0 / ACE
ACE 14
14.0.xxxx.xxxx
ACECORE.DLL
3.X / 4.0 / ACE
ACE 15
15.0.xxxx.xxxx
ACECORE.DLL
4.0 / ACE
ACE 16
16.0.xxxx.xxxx
ACECORE.DLL
4.0 / ACE


Access与Jet 对应表
Application/Version
Jet version
Microsoft Access 1.0
1.0
Microsoft Access 1.11.1
Microsoft Access 2.02.0
Microsoft Access 2.0 Service Pack2.5
Microsoft Access 95 / Excel 953.0
Microsoft Access 97 / Excel 97 / PowerPoint 97 / Word 973.5
Microsoft Access 20004.0 SP1
Microsoft Access 2002
Microsoft Access 2003
Microsoft Access 2007ACE 12
Microsoft Access 2010ACE 14
Microsoft Access 2013ACE 15
Microsoft Access 2016ACE 16


资料出处:(Wikipedia英文:https://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine)


Microsoft.Jet4.0 OLE DB Provider 与Microsoft.ACE.OLEDB.12.0

Microsoft.Jet4.0 OLE DB是Microsoft JET Database Engine的4.0版本。
Microsoft.ACE.OLEDB.12.0是Microsoft JET Database Engine的ACE12.0版本。
为啥同一个东西,名称不一样,因为它改名了!!!!
重点,两个都是Microsoft JET Database Engine,只不过是不同的版本。本质是一个东西!!!!
重点,两个都是Microsoft JET Database Engine,只不过是不同的版本。本质是一个东西!!!!
重点,两个都是Microsoft JET Database Engine,只不过是不同的版本。本质是一个东西!!!!

现在知道为什么Access2007也能用Jet4.0了嘛??
因为它使用的引擎是ACE12.0(见”Access与Jet表“),而ACE12.0引擎兼容Jet4.0(见”版本历史“)

现在知道为什么Access2010可以用ACE12.0(它针对的版本是Access2007)了嘛?
因为ACE14.0引擎也兼容Jet4.0(见”版本历史“)

-------------------------------------------------------------------------------------------------
Microsoft JET Database Engine安装须知

对于Microsoft.Jet4.0.OLE DB Provider:
A standalone version of the Jet 4 database engine was a component of Microsoft Data Access Components (MDAC), and was included in every version of Windows from Windows 2000 on.[7] The Jet database engine was only 32-bit and did not run natively under 64-bit versions of Windows. This meant that native 64-bit applications (such as the 64-bit versions of SQL Server) could not access data stored in MDB files through ODBC, OLE DB, or any other means, except through intermediate 32-bit software (running in WoW64) that acted as a proxy for the 64-bit client.[8]

引用来源同上:(Wikipedia英文:https://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine)



Microsoft.Jet4.0.OLE DB Provider根本不能在64位系统上安装!!!
(所以,别再问,为什么你的电脑上的UDL文件里没有Microsoft.Jet4.0.OLE DB Provider了)

对于Microsoft.ACE.OLEDB.XX.0 Provider:
Access]Access]Theengine in Microsoft Access 2010 discontinued support for Access 1.0, Access2.0, Lotus 1-2-3 and Paradox files.[12] A 64-bit version of Access 2010 and its ACE Driver/Providerwas introduced, which in essence provides a 64-bit version of Jet. The driver is notpart of the Windows operating system, but is available as aredistributable.[13]


Access2010之后,也就是ACE12.0(32位)之后版本都是64位驱动了,所以ACE14 ACE15 ACE16都是64位驱动。


引用来源同上:(Wikipedia英文:https://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine)

Jet 驱动和ACE都可以单独安装,或者随同Office安装(默认安装32位ACE驱动,哪怕你Office是64位,详见后文)!!!

-------------------------------------------------------------------------------------------------

ACE Data Provider安装须知

这里是个需要重点关注的地方,所以单独拿出来。


正常情况下,ACE Data provider驱动,32位和64位驱动,无法安装在同一台电脑上!!!(理由,Microsoft不支持,而且只是一句话,没有其它的解释)


链接如下:
Why can't 32 and 64 bit Access Database Engine (ACE/OLEDB Dataproviders) coexist?

微软社区的讨论内容,所以没有官方定论。本人在实际使用过程,安装个两个版本的驱动,但是没有过多测试,所以也不太清楚,同时安装的话,有什么问题。

ACE驱动的安装,最常见的方式是随同Office安装。而Office最常见的安装版本是32位的。你系统是64位,你的Office可能依然是32位,那位问题来了,UDL文件在windows 64位系统下,会调用上文提到的MDAC 64位组件,在32位系统下会调用MDAC 32位组件,也就意思着,如果你的系统是32位的,ACE驱动需要是32位的,如果你的系统是64位,那么ACE驱动需要64位,只有匹配了UDL才会显示出来,否则就会出现本文开头提到的问题,你会无法发现你需要的ACE驱动。

解决办法:所以本文的解决办法就是安装与系统位数匹配的ACE驱动!!如果没有与Access版本对应的驱动,可以直接安装Access2007也就是ACE12.0版本的驱动,因为它向后兼容~~


64位windows+64位Office+UDL,截图
01.png

从图中可以看出,我的电脑安装了ACE12.0和ACE16.0。


利用配置对话框提供的测试功能,ACE12.0和ACE16.0都可以正确的链接我的00.accdb数据库文件。
(但是UDL配置成功不代表LabVIEW可以正确链接,原因详见后方)


而使用LabVIEW的DCT工具来创建UDL文件,配置对话框如下:
06.png

其中只看到ACE12.0却没有ACE16.0,这是为什么呢?

分析DCT提供的范例并查看API函数,发现DCT使用的API函数调用了Microsoft OLE DB Service Component 1.0 Type Library的IDataSourceLocator的PromtNew()。
该方法的作用是弹出新的Data Link Properties对话框,也就是上图所示对话框。该类型库随oeldb32.dll程序集提供。也就是说,LabVIEW的DCT指定使用oeldb32.dll!!!
查询本机电脑上的oeldb32.dll文件,发现并没有64位版本。但由于知识限制,对这个不熟悉,无法解释这个原因。
现在只能假定它只提供32位的驱动,那我们就不难理解,为什么上面可以看到ACE12.0驱动而看不到ACE16.0了,因为ACE16.0是64位的!!(参见上文)

由于这个原因,也就导致你用32位的LabVIEW的DCT工具连接Access,不能使用超过ACE12.0版本的驱动。
那为什么你明明没有安装这个版本的驱动,你却能在你的电脑发现它呢,因为它要向后兼容!!在上文中,可以看到ACE12.0是第一个版本,也是ACE驱动中唯一的32位驱动。

总结:

1,如果你使用DCT工具提供的创建UDL功能来创建UDL文件的话,那么大概率你可以创建你需要的任何类型的数据库链接。因为它调用的是底层的oeldb32.dll,通过系统层面来识别已经注册在Windows上的Data provider驱动,所以你能看到上面图片中的Jet4.0啊,ACE12.0之类的驱动。

2,如果你只是简单的通过修改文件类型后缀,调用与.udl关联的程序来创建UDL的话,你大概率会因为关联.udl的程序是64位版本(因为你电脑是64版本,而这个程序是随机安装并关联)而导致你无法发现你需要的Access驱动。即使你发现有你需要的驱动,例如上图的ACE16.0,我通过UDL已经正常链接,但在LabVIEW中用DCT的相关函数测试链Access时,链接出错,提示 Provider not found.
07.png
(画线处解释:这个意思大概是这样的,如果你安装了32位和64位LabVIEW,默认使用64位版本,现在你通过32位版本写了一个VI,如果你不是在32位LabVIEW中直接打开这个vi,而直接双击打的话,那windows就会默认调用64位LabVIEW来打开这个VI,而不是32位的LabVIEW。我想表达的大致是这么个意思,但由于知识限制我无法保证解释正确)

以上写的凌乱,第一次在这儿发贴,就不讲究格式了。

PS:再次修改一下,编辑一下格式问题。







  • 05.png
  • 04.png
  • 03.png
  • 02.png
  • OLE DB 定义.png

回帖(7)

ljl5130

2020-2-22 18:23:22
先顶后看,规矩不乱!
举报

孙祥

2020-2-25 22:24:05
我看了一下,大略这么理解,就是不同运行环境调用的指令问题,OFFICE07之后阉割了一部分支持库,加强了对64位的支持,对32位的支持削弱了,而系统也会优先调用64位支持库,因此,操作环境和程序本身,都应该一一匹配。
举报

程子

2020-3-23 08:47:42
非常详细的说明,点歌赞!
举报

空腹今天

2021-1-11 14:41:11
多谢说明,总算是理清原因了
以后创建UDL直接通过labview自带的工具进行创建,这样就能避免这个问题了
1 1 举报
  • 梦游阿凡: 大佬能指导一下,怎么用LV创建一个UDL吗?

更多回帖

×
20
完善资料,
赚取积分