應用 SQLServer 連結伺服器訪問遠端 Access 資料庫
Web 開發中,經常要用到 Access 資料庫。但是由於 Access 是一種檔案型資料庫,所以無法跨伺服器進行訪問。經過筆者的探索,發現可以利用 SQL Server 的連結伺服器,把地理上分散的 Access 資料庫整合起來,使 Access 資料庫具有跨越 Web 伺服器群的能力。這樣做,還可以使 Access 資料庫與 SQL Server,甚至 Oracle 等網路資料庫連線起來,實現異構資料庫的互連,從而執行分散式的查詢、更新、命令和事務。
一、建立連結伺服器,連線本地 Access 資料庫
建立連結伺服器可以用“企業管理器”,也可以執行系統儲存過程 sp_addlinkedserver 來完成。用系統儲存過程相對快捷一些,格式為:
sp_addlinkedserver '連結伺服器名', '產品名', 'Microsoft.Jet.OLEDB.4.0', 'Access資料庫路徑及檔名'
指定 Microsoft.Jet.OLEDB.4.0 作為 provider_name,指定 Access 資料庫檔案的完整路徑名作為 data_source。.mdb 資料庫檔案必須駐留在本地伺服器上,路徑必須是伺服器上的有效路徑。
例如,本例建立一個名為 mytest 的連結伺服器,對 E:/我的文件/ 資料夾下名為 DOS.mdb 的 Access 資料庫進行操作,則在“SQL查詢分析器”中執行:
sp_addlinkedserver 'mytest', 'Access 2000', 'Microsoft.Jet.OLEDB.4.0', 'E:/我的文件/DOS.mdb'
二、建立連結伺服器登入對映
同樣可以用“企業管理器”或儲存過程來完成。儲存過程的格式為:
sp_addlinkedsrvlogin '連結伺服器', false, 'SQLServer登入名', 'admin', NULL
為訪問非保密的 Access 資料庫,試圖訪問 Access 資料庫的 SQL Server 登入應該有一個為使用者 Admin 定義的沒有密碼的登入對映,下例使得本地使用者 sa 可以訪問名為 mytest 的連結伺服器:
sp_addlinkedsrvlogin 'mytest', false, 'sa', 'admin', NULL
要訪問保密的 Access 資料庫,需使用登錄檔編輯器配置登錄檔,以便使用 Access 的正確的工作組資訊檔案。使用登錄檔編輯器向該登錄檔項中新增 Access 使用的工作組資訊檔案的完整路徑名稱:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/SystemDB
配置了登錄檔項後,請使用 sp_addlinkedsrvlogin 建立從本地登入到 Access 登入的登入對映:
sp_addlinkedsrvlogin 'mytest', false, 'sa', '[AccessUser]', '[AccessPwd]'
連結伺服器和連結伺服器登入對映建立完畢,可以在企業管理器裡進行檢視。
三、連結伺服器的測試
可以在“SQL查詢分析器”裡對建立的連結伺服器進行測試。由於 Access 資料庫沒有目錄和架構名稱,因此,基於 Access 的連結伺服器中的表可以在分散式查詢中使用 [linked_server]...[table_name] 的四部分名稱進行引用。下例從名為 mytest 的連結伺服器中檢索 articles 表的所有行:
Select * from mytest...articles
或:Select * from OpenQuery(mytest, 'Select * from .articles')
四、用程式碼訪問連結伺服器的 Access 資料庫
只有實現用程式碼訪問連結伺服器的 Access 資料庫,才使得連結伺服器發揮了最大的靈活性和實用性。可以使用三中的測試連結伺服器的程式碼建立儲存過程,供 Asp 程式碼呼叫,也可以直接在 Asp 程式碼中呼叫連結伺服器,以下是我通過測試的例子:
<%
Dim conn, sSQL, rs
conn="Provider=sqloledb; server=localhost; uid=sa; pwd=SQLSERVER;" '使用者 sa 的密碼為 SQLSERVER。可以省略資料庫名
on error resume next
sSQL = "select * from mytest...articles"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.open sSQL, conn, 1, 1
rs.movefirst
response.write rs(0) & "<br>"
if err.number<>0 then
response.write "取資料錯誤:資料庫連接出錯,或存取資料表錯誤!"
else
response.write "OK!"
end if
%>
張慶 2002.10.1 3:58