64位excel連接access數據庫

http://club.excelhome.net/thread-1107652-1-1.html@TOC

本帖已被收錄到知識樹中,索引項: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; 可以用的,看來是我原來寫的時候有沒注意到的細節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章