2011-05-23 152 views
2

當前我正在執行從Microsoft Access數據庫到SQL Express 2010數據庫的遷移。將Access數據庫轉換爲SQL

基本上,我有一個搜索客戶數據庫的Access應用程序。訪問應用程序分爲兩部分開發。每個客戶端上的訪問前端名爲application.mdb,而在Windows 2008服務器上的數據後端名爲data.mdb。 application.mdb具有3個到data.mdb的鏈接表。持有客戶和合同以及物品。客戶表涉及到合同表(一對多)和合同表涉及到的項目表(一對多)

我將data.mdb中的表導入到sql表中並以相同的名稱創建並創建相同的關係並將它們配置爲級聯。然後,我在客戶端上創建了一個obdc連接,並更新了application.mdb中的3個鏈接表以指向sql server上的表。

我啓動應用程序,一切似乎都很好,我可以完美地看到所有數據,性能提升非常值得。

然後,我發現一個問題,當我添加一個新的客戶到數據庫時,它自動編號客戶表和合同表,但不是項目表....因此,如果我試圖改變項目中的任何項目新客戶的桌子我不能。我得到以下錯誤「無法添加記錄;」表「項」的主鍵不在記錄集「這是有道理的,因爲SQL沒有自動編號的項目表。

我不明白爲什麼....

任何幫助將不勝感激。

+2

你可以發表項目表def嗎? – roberttdev 2011-05-23 12:44:19

+0

您是否試圖在綁定到SQL語句的窗體中添加記錄,這些SQL語句中有多個表? – 2011-05-28 23:46:07

+0

此外,請確保每個表都有一個時間戳字段。如果您使用SSMA for Access遷移數據,您可能會獲得更好的結果,因爲它足夠聰明,可以將事物從Jet/ACE轉換爲SQL Server,從而最大限度地減少事件中斷的可能性(並且它會添加時間戳記字段爲你自動)。 – 2011-05-28 23:49:33

回答

1

這聽起來像一個愚蠢的答案,但檢查項目表,以確保自動編號打開。

+0

正如我上面提到的,在SQL DB中,我已經在項目表中將主鍵設置爲名爲「itemID」的列,並且它具有以1遞增的標識 – Robert 2011-05-23 16:26:17

1

當你將Jet/ACE數據庫遷移到SQL Server時,我會建議的一件事是徹底檢查數據庫設計,例如:鍵和約束的實現,數據類型的選擇,索引的選擇等。 Jet/ACE與大多數SQL DBMS非常不同,因此您不應該認爲適用於Jet/ACE的數據庫設計自動適用於SQL DBMS。升遷嚮導並不總是能夠識別每一個可能的問題。

在SQL Server中,最接近的「自動編號」是IDENTITY屬性。檢查以確定表中的哪些列是IDENTITY,並在需要時創建一個IDENTITY列。

+0

在SQL DB中,我已將主鍵設置爲項目表作爲名爲「itemID」的列,並且它的身份加1。 – Robert 2011-05-23 16:25:07

2

那麼,只是手動添加記錄直接在項目視圖應告訴你,如果自動編號工作。當您在直接表格視圖中編輯+使用時,您必須使自動編號起作用。

像往常一樣,這些問題歸結到細節。使用基於SQL的後端與訪問應用程序進行比較時,有一點是不同的,那就是在實際保存記錄之前,不會在基於服務器的系統上生成自動編號(主鍵)。在使用基於噴氣機的後端時,自動編號在記錄變髒時即可使用。

因此,我會檢查是否有一些類型的代碼或事件正在試圖用作主鍵值的應用程序在記錄被實際保存之前運行。

通常訪問做得不錯。例如,當您在訪問中構建表單,然後有子窗體訪問編輯子記錄(和子表)時,通常當焦點從主窗體切換到子窗體時,訪問將強制保存主要記錄。這意味着主鍵(自動編號欄)現在可用於關係的正確運行。 Access可以並將使用此PK值,並將此值插入此子表中的外鍵值列中。

但是,只有當您在子窗體控件中正確設置鏈接主鏈接和鏈接子設置時,訪問纔會爲您完成。作爲在常規訪問中構建表單的一般規則,Access可以檢測所需的設置,並將正確的值插入鏈接主設備併爲您鏈接子設置。但是,鏈接表不會檢測到FK列。

因此,當您使用SQL Server時,您必須在子窗體控件中手動編輯和設置這些值。因此,我會檢查您用於編輯此數據的子表單中的鏈接主鏈接和子鏈接設置,並確保設置了正確的值。如果這是VBA代碼,那麼確保在嘗試使用並獲取PK值之前實際保存記錄。

我應該指出,即使在非基於SQL服務器的應用程序中,它也是在子窗體中設置鏈接主控+子設置,以允許訪問設置併爲您維護此外鍵值。所以訪問總是有能力爲你插入這些值,並且它會根據你的需要編寫任何代碼。因此,在插入和維護這些值的編輯過程中,Access會爲您完成所有工作(因此不是數據引擎會爲您插入這些FK值,而是用戶界面或某些情況下編寫代碼)

因此,訪問不會設置並插入這些正確的值,除非您在該子窗體控件中設置鏈接主控+子設置。

我只是簡單地檢查您的鏈接主控和子主控設置在您使用的任何子控件中是否正確。

+0

這正是問題所在,我沒有意識到SQL不會像訪問一樣管理自動增量。你有沒有可以管理這個過程的示例代碼? – Robert 2011-05-26 00:54:42

+0

Albert剛剛解釋瞭如何通過設計您的用戶界面來管理它,以便Access可以爲您解決問題。沒有必要的代碼。 – 2011-05-28 23:45:48

相關問題