2010-07-29 66 views
0

我有一個用戶給我發送了一封錯誤消息,當他試圖將記錄保存到Access 2003數據庫時發生了錯誤消息。除了無法保存數據庫設計更改的錯誤消息外,沒有其他任何異常,她只是試圖保存記錄。訪問 - 設計更改錯誤消息,而不嘗試進行更改

以下是完整的錯誤信息......

「的Microsoft Office Access不能保存 設計更改或保存到一個新的 數據庫對象,因爲其他用戶 打開了該文件。要保存設計 更改或保存到新對象, 您必須擁有對 文件的獨佔訪問權。「

在用戶系統中,Access 2003用作所有數據存儲在SQL Server 2008中的字體結尾。系統中有幾個用戶,因此兩個用戶完全有可能訪問同一記錄。事實上,錯誤消息似乎表明設計更改是當所有用戶試圖執行的操作都是保存記錄數據。

有什麼想法?

+0

它們使用存儲在中央網絡共享MDB文件的共享副本。 – webworm 2010-07-29 17:29:15

+1

這是一個嚴格的禁忌。每個用戶都必須擁有自己的前端副本,但是,您仍然不應該收到設計更改錯誤。 – Fionnuala 2010-07-29 19:12:53

+2

用戶在嘗試保存記錄時嘗試使用什麼方法?如果2個用戶具有相同的FE打開,並且一個使用Ctrl + s,則Access將嘗試保存表單本身......這需要獨佔訪問數據庫。 – HansUp 2010-07-29 19:33:01

回答

3

這不是對您的問題的回答(我認爲HansUp提供了對該問題最合理的解釋),但解釋了爲什麼您不應該共享前端。

在Access 2000之前,前端(表單,報表,模塊等)的用戶界面對象的定義存儲在系統表中,每個對象只有一條記錄。當A2000被引入時,MS改變了這一點,以便將VBE整合到Access中(以便與其他託管VBA的Office應用程序保持一致)。這需要改變存儲代碼承載對象(或可能代碼承載)的方式。系統表中的每個對象只有一條記錄,而VBA項目中的所有Access對象都存儲在系統表中單個記錄中的整體BLOB字段中。

現在,備份一分鐘,並考慮舊版本的工作原理。

當用戶編輯表單並保存編輯時,只有系統表中代表該表單的記錄被更改。如果多個用戶使用該前端,可能不會有任何併發​​問題,因爲他們不會同時加載相同的系統表記錄,也不會同時更新它們。

你可能會說「但我不會在我的前端進行設計更改!」

但你會錯的。訪問透明地保存表單的某些用戶修改的屬性,特別是過濾器和排序。除非使用DoCmd.Close acForm,Me.Name,acSaveNo關閉表單,否則用戶對過濾器所做的更改和排序將保存到幕後表單的定義中。當用戶按下Ctrl-S鍵命令時,可能會顯式保存其他一些屬性,例如表單大小和位置。其他更改可能會導致提示,例如用戶是否隱藏/調整數據表格中的列的大小(不準確地發生那裏發生的事情 - 可能需要Ctrl-S)。

現在,考慮一下A97和之前發生了什麼 - 每次用戶關閉系統表中的記錄所表示的每個表單可能會更新,但碰撞方式並不多,用戶在設計模式下打開表單,所以每個人都使用樂觀鎖定,所以當他們關閉表單時,他們的更改會被保存。現在,如果另一個用戶關閉表單,可能會得到另一個用戶更改表單的提示,但可能不是(我不知道,因爲我從來沒有在任何Access版本中共享前端)。

隨着A2000,每一個變化到在前端的每個用戶接口對象是一個改變爲存儲在單個單片BLOB字段在一個單一的記錄中的數據。這意味着有多個用戶嘗試更新單個記錄中的相同字段可以保證併發性問題。

其次,它是一個巨大的BLOB字段,它的內部結構是相當複雜的,但完全陌生到Jet/ACE(這實際上是處理該字段中的數據的讀取和保存)。

爲了把這個在常規數據庫應用方面,共享前端就像有一個備註字段,所有的用戶都試圖在一個記錄同時輸入到相同的備註字段一個數據庫應用程序。這會導致可怕的併發問題,並可能很快破壞備忘指針。

當您共享一個接入前端,你正在做同樣的事情 - 讓所有的用戶在一個單一的記錄同時編輯一個字段。

一旦你理解了這一點,應該是不言而喻的,你不應該這樣做。

+0

真棒解釋大衛!非常感謝你。 – webworm 2010-08-03 16:57:47