如果你想在 SQL Server 中使用現有的 Access 應用程式,可以將原本的 Access 資料表連結到遷移後的 SQL Server 或 Azure SQL 資料表。 連結會修改 Access 資料庫,讓您的查詢、表單、報表和數據存取頁面使用 SQL Server 或 Azure SQL Database 中的數據,而不是 Access 資料庫中的數據。
注意
你的 Access 資料表仍保留在 Access,但不會隨著 SQL Server 或 Azure SQL 更新同步更新。 鏈接資料表並驗證功能之後,您可能會想要刪除 Access 資料表。
連結存取與 SQL Server 資料表
當你將 Access 資料表連結到 SQL Server 或 Azure SQL 資料表時,Jet 資料庫引擎會儲存連線資訊和資料表的元資料,但資料會儲存在 SQL Server 或 Azure SQL 中。 這種連結方式讓你的 Access 應用程式能針對 Access 資料表運作,即使實際的資料表和資料是在 SQL Server 或 Azure SQL 中。
注意
如果您使用 SQL Server 驗證,密碼會以純文字儲存在連結的 Access 數據表上。 建議改用 Windows 認證。
在 [存取元數據總管] 中,選取您要鏈接的數據表。
以滑鼠右鍵按鍵按下 資料表,然後選取 [連結]。
Access 的 SQL Server 移轉小幫手 (SSMA) 會備份原始的 Access 數據表,並建立連結的數據表。
鏈接數據表之後,SSMA 中的數據表會出現一個小連結圖示。 在 Access 中,數據表會以「連結」圖標顯示,圖標是一個地球及指向它的箭頭。
當你在 Access 中開啟資料表時,資料會透過鍵組游標取得。 因此,對於大型資料表,資料不會一次全部被取回。 然而,當你瀏覽資料表時,Access 會根據需要取得更多資料。
重要
要將 Access 資料表與 Azure 資料庫連結,你需要 SQL Server Native Client(SNAC)版本 10.5 或更新版本。 請從 Microsoft SQL Server 2008 R2 功能包取得最新版本的 SNAC。 SNAC 在 SQL Server 2022(16.x)中被移除。
解除連結 Access 資料表
當你從 SQL Server 或 Azure SQL 資料表中解除連結 Access 資料表時,SSMA 會恢復原本的 Access 資料表及其資料。
在 [存取元數據總管] 中,選取您要取消鏈接的數據表。
按滑鼠右鍵 [資料表],然後選取 [取消連結]。
將資料表連結到另一台伺服器
如果你將 Access 資料表連結到一個 SQL Server 實例,之後想更改連結到另一個實例,必須重新連結這些資料表。
在 [存取元數據總管] 中,選取您要取消鏈接的數據表。
以滑鼠右鍵按一下 [資料表],然後選取 [取消連結]。
選擇 「重新連接 SQL Server 」按鈕。
連接到您要連結 Access 資料表的 SQL Server 或 Azure SQL 實例。
在 [存取元數據總管] 中,選取您要鏈接的數據表。
以滑鼠右鍵按鍵按下 資料表,然後選取 [連結]。
更新連結表格
如果你更改了 SQL Server 或 Azure SQL 資料表的定義,你可以使用本文前述的步驟,在 SSMA 中解除連結再重新連結這些資料表。 您也可以使用 Access 來更新資料表。
開啟 Access 資料庫。
在 物件 清單中,選擇 資料表。
以滑鼠右鍵按下連結資料表,然後選取 [鏈接資料表管理員] 。
在每個你想更新的資料表旁勾選一個勾選框,然後選擇 確定。
移轉後可能發生的問題
以下章節列出在將資料庫從 Access 遷移到 SQL Server 或 Azure SQL 後,現有 Access 應用程式可能出現的問題,然後連結資料表。 這些章節也描述了這些問題的成因與解決方法。
鏈接資料表的效能變慢
原因:部分查詢在擴充後可能會變慢,原因如下:
這個應用程式依賴於 SQL Server 或 Azure SQL 中不存在的函式。 Jet 會從本地拉下資料表來執行
SELECT查詢。Jet 會將查詢轉換為針對每一列的參數化查詢來更新或刪除多列。
解決方法:將緩慢執行的查詢轉換為直通查詢、儲存程序或檢視。 轉換成直傳查詢有下列問題:
你無法修改直通查詢。 你必須修改查詢結果或以其他方式新增紀錄。 例如,你可以在表單上設置明確的 「修改 」或 「新增 」按鈕,綁定到查詢。
直通查詢不支援使用者輸入,但有些查詢需要使用者輸入。 你可以使用 Visual Basic for Applications(VBA)來提示參數,或是透過表單取得使用者輸入。 在這兩種情況下,VBA程式代碼都會使用使用者輸入將查詢提交至伺服器。
自動遞增欄位只有在記錄更新前才會更新
原因:呼叫 RecordSet.AddNew Jet 後,自動增量欄位會在紀錄更新前可用。 這個條件在 SQL Server 或 Azure SQL 中並不成立。 身份欄位的新值只有在儲存新紀錄後才會開放。
解析:在存取身份欄位前,執行以下 Visual Basic for Applications(VBA)程式碼:
Recordset.Update
Recordset.Move 0,
Recordset.LastModified
新紀錄無法取得
原因:當你用 VBA 將記錄加入 SQL Server 或 Azure SQL 資料表時,如果該資料表的唯一索引欄位有預設值,且你沒有為該欄位指派值,那麼新記錄直到你在 SQL Server 或 Azure SQL 重新開啟該資料表時才會出現。 如果你嘗試從新紀錄取得值,會收到以下錯誤訊息:
Run-time error '3167' Record is deleted.
解決方法:當你使用 VBA 程式碼開啟 SQL Server 或 Azure SQL 表格時,請包含該 dbSeeChanges 選項,如下範例所示:
Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)
遷移後,有些查詢不允許使用者新增紀錄
原因:如果查詢沒有包含唯一索引中所有欄,你就無法透過查詢新增新的值。
解決:確保至少包含一個獨特索引的所有欄位都包含在查詢中。
你無法透過使用 Access 修改連結表結構
原因:在遷移資料並連結資料表後,你無法在 Access 中修改資料表的結構。
解決方法:使用 SQL Server Management Studio 修改資料表結構,然後在 Access 中更新連結。
移轉數據之後,超連結功能會遺失
原因:資料遷移後,欄位中的超連結會失去功能,變成簡單的 nvarchar(max) 欄位。
答案:無。
Access 不支援某些 SQL Server 資料型別
原因:如果你更新了 SQL Server 或 Azure SQL 資料表,加入 Access 不支援的資料 型態 ,你就無法在 Access 裡開啟該資料表。
解決方法:定義一個僅回傳支援資料型別的列的存取查詢。