access|資料|資料庫|問題 自己平時做的網站大多使用的是SQL資料庫,所以對使用ACCESS資料庫的網站沒有太多的接觸。昨日在幫朋友做一個使用ACCESS資料庫的網站後台管理程式時,遇到了一些麻煩。
該網站的目錄設定如下(只列出了相關部分)
F1目錄是後台管理程式所在,F2目錄下的MYDATA.MDB是資料庫檔案,CNN.ASP中寫明了資料庫的串連方式,在其他檔案中以包含檔案的方式來使用。
因為MYDATA.MDB和CNN.ASP在同一目錄下,因此CNN.ASP中的串連語句是這麼寫的:
strCnn = "driver={microsoft access driver (*.mdb)};dbq=" & _
Server.Mappath("mydata.mdb")
由於是原來寫好的,我沒有仔細考慮什麼,就直接在F1目錄下的INDEX.ASP檔案中加入F2語句
<!--#include file="../F2/Cnn.asp" -->
然後運行……嗯???出錯了!!
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Microsoft Access Driver]常見錯誤 不能開啟註冊表關鍵字 'Temporary (volatile) Jet DSN for process 0x94 Thread 0x9a0 DBC 0x13b0074 Jet'。
錯誤提示是在OPEN資料庫時出錯了,沒有找到該資料庫。難道是資料庫路徑不對?
將CNN.ASP中的strCnn輸出看看先
driver={microsoft access driver (*.mdb)};dbq=C:\F1\mydata.mdb
果然,路徑錯誤!
看來,是這個Server.MapPath將包含CNN.ASP檔案的分頁檔的所在路徑做為了當前路徑。即如果是F1目錄下的INDEX.ASP包含了CNN.ASP,則此時的Server.MapPath("mydata.mdb")就是C:\F1\mydata.mdb;如果F1目錄下的NEWS目錄下某個檔案包含了CNN.ASP,則此時的Server.MapPath("mydata.mdb")就是C:\F1\News\mydata.mdb;
經過驗證,證明情況確實如上。
問題發現了,就該解決了它。由於無法限定在幾級目錄中要包含CNN.ASP檔案,因此使用Server.MapPath就無法擷取資料庫正確的路徑;難道要在所有使用資料庫的檔案中全部寫入該資料庫的串連?這是下下策,盡量避免。
經過N分鐘的思考,終於想出了一個較為划算的方法,就是不使用虛擬路徑,先確定根目錄的實際路徑,然後加入資料庫的所在路徑。實現代碼如下:
Cnn.asp檔案:
Dim strCurPath,strCurLocation
'擷取包含該檔案的分頁檔的虛擬路徑
strCurPath=Request.ServerVariables("PATH_INFO")
'擷取包含該檔案的分頁檔的實際路徑
strCurLocation=Request.ServerVariables("PATH_TRANSLATED")
'轉換路徑間隔符號(虛擬路徑用"/"分隔,實際路徑用"\"分隔)
strCurPath=Replace(strCurPath,"/","\")
'得到網站根目錄的實際路徑
strCurLocation=Replace(strCurLocation,strCurPath,"")
'指定資料庫實際路徑
strCurLocation=strCurLocation & "\F2\MyData.mdb"
Set Cnn = Server.CreateObject("ADODB.CONNECTION")
'串連到資料庫伺服器,資料庫名稱 mydata.mdb
strCnn = "driver={microsoft access driver (*.mdb)};dbq=" & strCurLocation
Cnn.Open strCnn
就這些了,扔磚頭吧