ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 32085|回复: 34

[原创] 64位WIN7环境下使用ADO连接ACCESS数据库

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-29 12:07 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:ADO技术
先介绍下背景,老板比较会省钱,我也比较懒,所以有些工作不想手工做,老板也不给上软件(就算上,有些也比较琐碎,不是度身定制软件还不定合用),只好没有条件创造条件。我所能做的也就是充分利用EXCEL以及VBA所带来的便利,当然过程中也没少在EXCEL HOME上潜水(大部分都是现学现卖,用啥学啥,都是泪啊……)。
咱是讲团队的人,所以有比较强烈的团队合作的需求,随之而来的就是团队间需解决数据共享和数据交换的问题,光用EXCEL共享已经不能满足要求,就从坛子上学会了用EXCEL做前端,用ACCESS作为数据库,并布置在局域网上,来实现某些数据的共享和交换。
切入正题,我可能属于比较老套和落后的,一直用32位的系统,最近才把电脑的系统换成了64位的WIN7,OFFICE也顺便换成了64位的2013,问题就来了,原来用的好好的文件提示“运行时错误‘3706’未找到提供程序。改程序可能为正确安装。“。分析,上网查……等等,发现时ADO的问题,貌似说是ADO是32位下的组件,在64位下无法运行(不知道到底是不是这个原因,就当他是吧)。于是开始不死心尝试引用不同的ADO版本,从2.8试到了6.1,都不行……
我当时的心情…………我真想问候微软他##,既然不能用,你为啥在64位的OFFICE上引用里还能看到ADO呢?这不是肯爹吗!
一开始,网上看到的解决方法基本都是 放弃64位的OFFICE………………我没有尝试,因为我记得以前我同事64位XP+32位的OFFICE2007运行不起来的情况(以前没有意识到是这个问题,现在想来才觉得是同样的问题),而且网上看到VB啥的貌似也有这个问题。所以我个人武断的判断这不是换个OFFICE就能解决的,应该还是环境--64位WIN7的问题。
放弃64位系统,我想过,不过不甘心浪费内存,而且以后换新机器怎么办,现在可基本都是64位的系统。总不见得老板让换新电脑我拒绝的吧,或者说那个8G内存的机器跑32位的系统(会被笑话的)。
秉着存在就有道理的精神,继续在网上挖……
两篇博文,让我看到了希望
这里,我先要感谢那两位博主yandong_8212和张三丰,虽然我完全不认识他们,他们也不知道我,不过这次正儿八经帮了我一把
http://blog.163.com/yandong_8212/
http://blog.sina.com.cn/s/blog_3d1c581901011swc.html
他们两位给出的解决方法基本是类似的,都是使用AccessDatabaseEngine(Microsoft Access Database Engine 2010 Redistributable http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en
两位博主的博文,一位是需要先删除OFFICE然后再安装那个ENGINE,使用方法,大侠可能觉得太简单,就么说,就转了微软官网介绍(一开始我也没认真看,哎……),苦了菜鸟我。
还有一位博主,是先安装ENGINE,然后修改连接串(他没要删OFFICE,所以我先按他的方法试的)
64位机器用

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路径;HDR=YES;
32位机器用
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件路径;HDR=YES

估计是我资质有限,或者是什么地方设置发生了错误,如是修改后报错。

不愿放弃,再回过头去看微软官网关于这个ENGINE的说明,安装介绍里有如下一段
To use this download:
  • If you are the user of an application, consult your application documentation for details on how to use the appropriate driver.
  • If you are an application developer using OLEDB, set the Provider argument of the ConnectionString property to “Microsoft.ACE.OLEDB.12.0”

    If you are connecting to Microsoft Office Excel data, add the appropriate Extended Properties of the OLEDB connection string based on the Excel file type:

    File Type (extension)                                             Extended Properties
    ---------------------------------------------------------------------------------------------
    Excel 97-2003 Workbook (.xls)                                  "Excel 8.0"
    Excel 2007-2010 Workbook (.xlsx)                             "Excel 12.0 Xml"
    Excel 2007-2010 Macro-enabled workbook (.xlsm)      "Excel 12.0 Macro"
    Excel 2007-2010 Non-XML binary workbook (.xlsb)      "Excel 12.0"
  • If you are an application developer using ODBC to connect to Microsoft Office Access data, set the Connection String to “Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”
  • If you are an application developer using ODBC to connect to Microsoft Office Excel data, set the Connection String to “Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”
既然高大上的微软都这么说了,那我也就试试看,居然就成了,我链接部分的代码如下:

Set cnn = New ADODB.Connection
    cnn.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=\\192.168.1.140\d_peizhi\peizhi.mdb"
Set RST = New ADODB.Recordset
Sql = "select * from peizhiNO1 order by ID"
    RST.Open Sql, cnn, adOpenKeyset, adLockOptimistic
    peizhi.Range("A2").CopyFromRecordset RST

    RST.Close
那个开心啊,菜鸟我,终于为换新电脑做好了充分的准备。

就我那点东西,难道以后还要分32位和64位两个版本?显然那不符合我偷懒的个性,于是我想让他们兼容。
我能想出来的方法就两个:
  • 从头再来,去找能兼容32位和64位的连接方法。  (啥,从头再来,能找到么,算了放弃吧)
  • 用代码判断当前系统是32位还是64位然后选择相应的代码执行。(好吧,这个貌似容易一点,我选这个)
网上看到的判断系统64位的方法基本上都要声明API啥的,看了头晕,贴上去能用,还用用,结果贴了几个代码都用不起来(资质有限啊),果断放弃,还是走我的野路子吧。

网上看到使用Application.OperatingSystem可以查到系统的版本,具体显示的格式大概如下(我机器上的版本)
Windows (64-bit) NT 6.01
在32位的win7和XP上我也试了下,显示的格式也是这样,只不过括号里是32-bit和最后的版本号不一样。
既然这样,我就用InStr函数来判断Application.OperatingSystem返回的值里面是否包含字符”64-bit“,如果不包含就认为是32位的,如果包含,就认为是64位的。定义了一个公共变量(为了方便其他位置调用),用来传递不同的链接代码,给一段我的代码(业余选手,多多指正)。

Public db_address As String, db_name As String, name01 As String, name02 As String, name03 As String, name04 As String, name05 As String, name06 As String, name11 As String, name12 As String, name13 As String, name14 As String, name15 As String, name16 As String, htnf As String
Public nv As String, nvn As String, nvl As String, oandn As String, myv As String
Public ct As String

Public Sub L_PEIZHI()
'---------------------------------------------------------------- 判断系统是否为64位
re = InStr(1, Application.OperatingSystem, "64-bit", vbTextCompare)
If re = 0 Then
    ct = "provider=Microsoft.jet.OLEDB.4.0;data source="
Else
    ct = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="
End If

'----------------------------------------------------------------- 载入基本配置
Set cnn = New ADODB.Connection
    cnn.Open ct & "\\192.168.2.110\d_peizhi\peizhi.mdb"
Set rst = New ADODB.Recordset
Sql = "select * from peizhiNO1 order by ID"
    rst.Open Sql, cnn, adOpenKeyset, adLockOptimistic
    peizhi.Range("A2").CopyFromRecordset rst

db_address = peizhi.Cells(2, 3)
db_name = peizhi.Cells(3, 3)
name01 = peizhi.Cells(4, 3)
name02 = peizhi.Cells(5, 3)
name03 = peizhi.Cells(6, 3)
name04 = peizhi.Cells(7, 3)
name05 = peizhi.Cells(8, 3)
name06 = peizhi.Cells(9, 3)
name11 = peizhi.Cells(10, 3)
name12 = peizhi.Cells(11, 3)
name13 = peizhi.Cells(12, 3)
name14 = peizhi.Cells(13, 3)
name15 = peizhi.Cells(14, 3)
name16 = peizhi.Cells(15, 3)
htnf = peizhi.Cells(16, 3)
nv = peizhi.Cells(17, 3)
nvn = peizhi.Cells(18, 3)
nvl = peizhi.Cells(19, 3)
oandn = peizhi.Cells(20, 3)
myv = guanyu.Cells(1, 2)
End Sub

因为自己被64位这个问题折腾了一天,所以决定写出来,供需要的人参考。
PS:第一次发这样的帖子…………

附上64位AccessDatabaseEngine在百度云的下载地址,想该比微软速度要快点的吧 http://pan.baidu.com/s/1pJ0jhFl





补充内容 (2015-1-11 13:28):
后来发现Provider=Microsoft.ACE.OLEDB.12.0;Data Source=文件路径;HDR=YES; 可以用的,看来是我原来写的时候有没注意到的细节

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-29 15:34 | 显示全部楼层
http://bbs.csdn.net/topics/340269438

1. 下载运行 AccessDatabaseEngine_x64.exe
(http://www.microsoft.com/downloa ... &displaylang=en)

2. 改变连接字符串:
Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=mdb.mdb;uid=admin;pwd=password;

TA的精华主题

TA的得分主题

发表于 2014-3-29 15:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-5-19 14:27 | 显示全部楼层
刚换的64位WIN7和EXCLE,感谢!

TA的精华主题

TA的得分主题

发表于 2014-12-30 22:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢了,我是64WIN8.1OFFICE2013

TA的精华主题

TA的得分主题

发表于 2014-12-31 08:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-12-31 09:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-6-1 13:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-6-24 22:34 | 显示全部楼层
正好解决了问题。尝试一下。非常感谢。

TA的精华主题

TA的得分主题

发表于 2015-7-7 06:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的机器上也出现了3706的错误,弄了好几天,这个帖子帮助了我,下载了microsoft.ace.oledb.12.0的控件,安装一下,好使了,谢谢楼主
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-23 20:29 , Processed in 0.047525 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表