1. 程式人生 > >應用 SQLServer 連結伺服器訪問遠端 Access 資料庫

應用 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