如果您想要搭配 SQL Server 使用現有的 Access 應用程式,您可以將原始 Access 資料表連結至已移轉的 SQL Server 或 SQL Azure 資料表。 連結會修改 Access 資料庫,讓您的查詢、表單、報表和數據存取頁面使用 SQL Server 或 Azure SQL Database 中的數據,而不是 Access 資料庫中的數據。
注意
您的 Access 數據表會保留在 Access 中,但不會與 SQL Server 或 SQL Azure 更新一起更新。 鏈接資料表並驗證功能之後,您可能會想要刪除 Access 資料表。
連結 Access 和 SQL Server 數據表
當您將 Access 數據表連結至 SQL Server 或 SQL Azure 數據表時,Jet 資料庫引擎會儲存連線資訊和數據表元數據,但數據會儲存在 SQL Server 或 SQL Azure 中。 此連結可讓您的 Access 應用程式針對 Access 資料表運作,即使實際數據表和數據位於 SQL Server 或 SQL Azure 中也一樣。
注意
如果您使用 SQL Server 驗證,密碼會以純文字儲存在連結的 Access 數據表上。 我們建議使用 Windows 驗證。
連接表格
在 [存取元數據總管] 中,選取您要鏈接的數據表。
以滑鼠右鍵按鍵按下 資料表,然後選取 [連結]。
Access 的 SQL Server 移轉小幫手 (SSMA) 會備份原始的 Access 數據表,並建立連結的數據表。
鏈接數據表之後,SSMA 中的數據表會出現一個小連結圖示。 在 Access 中,數據表會以「連結」圖標顯示,圖標是一個地球及指向它的箭頭。
當您在 Access 中開啟資料表時,會使用鍵集游標擷取資料。 因此,對於大型數據表,不會一次擷取所有數據。 不過,當您瀏覽數據表時,Access 會視需要擷取其他數據。
重要
若要連結存取數據表與 Azure 資料庫,您需要 SQL Server Native Client(SNAC) 10.5 版或更新版本。
您可以從 Microsoft SQL Server 2008 R2 Feature Pack取得最新版本的 SNAC。
解除連結 Access 資料表
當您將 Access 數據表從 SQL Server 或 SQL Azure 數據表取消連結時,SSMA 會還原原始的 Access 數據表及其數據。
取消連結數據表
在 [存取元數據總管] 中,選取您要取消鏈接的數據表。
按滑鼠右鍵 [資料表],然後選取 [取消連結]。
將數據表連結至不同的伺服器
如果您已將 Access 數據表連結至一個 SQL Server 實例,且稍後想要變更另一個實例的連結,則必須重新連結數據表。
若要將數據表連結至不同的伺服器
在 [存取元數據總管] 中,選取您要取消鏈接的數據表。
以滑鼠右鍵按一下 [資料表],然後選取 [取消連結]。
按一下 重新連線到 SQL Server 按鈕。
連接到您要連結 Access 數據表的 SQL Server 或 SQL Azure 實例。
在 [存取元數據總管] 中,選取您要鏈接的數據表。
以滑鼠右鍵按鍵按下 資料表,然後選取 [連結]。
更新連結的數據表
如果 SQL Server 或 SQL Azure 資料表定義已改變,您可以使用本主題先前所示的程式取消連結,然後重新連結 SSMA 中的數據表。 您也可以使用 Access 來更新資料表。
使用 Access 更新連結資料表
開啟 Access 資料庫。
在 [物件] 列表中,按一下 [資料表] 。
以滑鼠右鍵按下連結資料表,然後選取 [鏈接資料表管理員] 。
選取您要更新之每個連結資料表旁的複選框,然後按下 [確定] 。
移轉後可能發生的問題
下列各節列出從 Access 移轉至 SQL Server 或 SQL Azure 之後,現有 Access 應用程式中可能發生的問題,然後鏈接數據表,以及原因和解決方法。
鏈接資料表的效能變慢
原因: 某些查詢在升級後可能會變慢,原因如下:
應用程式取決於 SQL Server 或 SQL Azure 中不存在的函式,這會導致 Jet 在本機提取數據表以執行 SELECT 查詢。
Jet 會將更新或刪除許多數據列的查詢當作每個數據列的參數化查詢來傳送。
解決方式: 將慢速執行的查詢轉換成傳遞查詢、預存程式或檢視。 轉換成直傳查詢有下列問題:
無法修改傳遞查詢。 若要修改查詢結果或新增記錄,必須使用其他方法來完成,例如,在綁定查詢的表單上提供明確的 修改 或 新增 按鈕。
某些查詢需要使用者輸入,但傳遞查詢不支援用戶輸入。 使用者輸入可以透過Visual Basic for Applications (VBA) 程式代碼取得,該程式碼會提示輸入參數,或由做為輸入控件的表單取得。 在這兩種情況下,VBA程式代碼都會使用使用者輸入將查詢提交至伺服器。
在更新記錄之前,不會更新自動遞增數據行
原因: 在 Jet 中呼叫 RecordSet.AddNew 後,自動遞增欄位會在記錄更新前變得可用。 在 SQL Server 或 SQL Azure 中,這不是真的。 只有在儲存新記錄之後,才能使用標識列新值的新值。
解析: 存取身分識別欄位之前,執行下列 Visual Basic for Applications (VBA) 程式代碼:
Recordset.Update
Recordset.Move 0,
Recordset.LastModified
無新記錄可用
原因: 當您使用 VBA 將記錄新增至 SQL Server 或 SQL Azure 數據表時,如果數據表的唯一索引欄位具有預設值,而且您未將值指派給該字段,則在您重新開啟 SQL Server 或 SQL Azure 中的數據表之前,才會顯示新的記錄。 如果您嘗試從新記錄取得值,您會收到下列錯誤訊息:
Run-time error '3167' Record is deleted.
解析: 當您使用 VBA 程式代碼開啟 SQL Server 或 SQL Azure 數據表時,請包含 dbSeeChanges
選項,如下列範例所示:
Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)
移轉之後,某些查詢將不允許使用者新增記錄
原因: 如果查詢不包含唯一索引中包含的所有欄位,您無法使用查詢來新增新值。
解析: 確定至少一個唯一索引中包含的所有數據行都是查詢的一部分。
您無法使用 Access 修改連結資料表架構
原因: 移轉數據和鏈接數據表之後,用戶無法在 Access 中修改數據表的架構。
解析: 使用 SQL Server Management Studio 修改數據表架構,然後更新 Access 中的連結。
移轉數據之後,超連結功能會遺失
原因: 移轉數據之後,數據行中的超連結會失去其功能,並變成簡單的 nvarchar(max) 數據行。
解析: 無。
Access 不支援某些 SQL Server 數據類型
原因: 如果您稍後更新 SQL Server 或 SQL Azure 數據表以包含 Access 不支援的數據類型,則無法在 Access 中開啟數據表。
解析: 您可以定義 Access 查詢,只傳回支援數據類型的數據列。