2010-04-26 64 views
1

我不是Access專家,但是一位SQL專家。我繼承了一個Access前端參考,對約5000條記錄的工作確定一個SQL 2005數據庫,但慘遭失敗爲800K記錄...Access 2007的moveNext/moveFirst /等功能如何工作?

在SQL事件探查器&活動經理,我看到某種訪問的幕後查詢關鍵詞,比如:

選擇 「MS1」, 「ID」 FROM 「DBO」 「客戶」 「MS1」 ORDER BY 「MS1 ID」

的MS前綴沒有出現在任何接入代碼。 「」我可以看到。我懷疑內置的訪問導航代碼:

DoCmd.GoToRecord , , acNext 

的GoToRecord有AcRecord不變,其中包括像acFirst,acLast,acNext,acPrevious和acGoTo。

在數據庫上下文中移動到「下一個」記錄意味着什麼?這個特定的表使用身份列作爲PK,所以它在內部抓取所有的ID,然後移動到下一個最高的那個?

如果是這樣,如果一個表由PK的三個不同的字段組成,它將如何工作?

或者我在錯誤的軌道上,和Access中的其他東西調用該語句?不幸的是,我在分析器中看到大量準備好的語句。

謝謝!

回答

2

First實際上是Recordset中的第一行。一般來說,Access通過等效的遊標訪問數據。因此,NextPrevious在Recordset中一次一個地向前和向後移動,就像使用SQL Server的遊標一樣。在構造Recordset時要小心取決於沒有ORDER BY語句的行的順序。儘管Access是一個ISAM,但不應該依賴以任何特定順序出現的行。根據遊標類型的不同,Access不會將整個表格拉下來,但一般會一次請求一條記錄。也就是說,我看到Access出於任何原因拉取整個表。

+0

愚蠢的字符數限制!這個應用程序不是非常複雜 - 只有五張左右的表格,但是一張桌子上有大約30萬條記錄,另一張桌子上有大約800萬條記錄。該應用程序基本上允許簡單的記錄編輯。 如果我們使用光標,多用戶編輯如何工作?似乎Access的行爲恰當,在每個機會動態刷新主鍵(PK)列表。 如何指定遊標類型? 這裏沒有記錄集。相反,我認爲Access只是指向整個表。 – 2010-04-26 23:16:05

+0

@Chris M - RE:多用戶編輯,我們是在討論一個前端/後端的所有Access配置,一個Access表格與一個真正的DBMS鏈接表,還是一個Access ADP與一個真正的DBMS?一般來說,RS如何打開決定了如何設置鎖。如果使用adLockOptimistic打開RS,Access將在保存期間鎖定記錄。如果設置爲adLockPessimistic,它將在編輯時鎖定該記錄。標準表單通常會在編輯過程中鎖定行。在ADP設置中,我認爲它只是基於PK進行更新,但使用光標從一行循環到下一行。 – Thomas 2010-04-27 00:25:44

+0

前端Access 2007,通過ODBC後端SQL 2005。該應用程序幾乎可以互換地使用adLockOptimistic和adLockPessimistic。我懷疑作者是否知道這個區別。 最糟糕的部分是我認爲這裏真正的問題是固有控制提供的記錄集導航。不知何故,我需要防止訪問重複帶回主鍵。 我想最終我會修改應用程序,通過存儲過程完全加載數據,並斷開與SQL表的連接。我會自己處理所有的導航。謝謝! – 2010-04-27 03:38:31

2

您必須區分自動化Access對象和使用代碼中的記錄集。

在表單中,這個命令的意思:

DoCmd.GoToRecord , , acNext 

它是特異性的,它是不可預測的東西記錄它會去,除非你知道基礎記錄的形式和啓動順序記錄。它會瀏覽存儲在窗體的編輯緩衝區中的記錄集(該窗體在窗體的OnOpen事件中加載)。例如,該命令將用於命令按鈕背後的代碼中,該按鈕的目的是導航加載到當前具有焦點的表單中的記錄。如果我要使用該命令,我絕不會忽略可選參數(我幾乎從不這樣做)。相反,我會確定具體的形式,我想它適用於:

DoCmd.GoToRecord acForm, "MyForm", acNext 

在遍歷DAO記錄,.MoveNext也有不同之處,如果你知道的排序和啓動記錄中沒有預定義的含義。當你正在走一個記錄集時(你不應該經常這樣做,因爲它效率很低,但取決於你需要執行的任務)並且需要擊中每條記錄,所以你肯定會打電話。MoveNext作爲你的循環的一部分:

With rs 
    .MoveFirst ' technically not required, as it's the default starting point 
    Do Until .EOF 
     [do something] 
     .MoveNext  
    Loop 
    End With 

那裏沒有什麼神祕的。它很可能用於具有少量記錄的代碼中(大型記錄集實際上不應該按順序導航)。

在回答您的具體問題:

是什麼意思在數據庫 背景下移動到「下一個」紀錄? 這種特殊的表使用標識 列作爲PK,所以是它在內部 抓住所有的ID,然後移動 到一個是下一個最高???

......正如我所說,下一個記錄是由所遍歷的記錄集的順序和起始位置決定的。在表單的情況下,它是正在遍歷的編輯緩衝區,並且隨着編輯緩衝區中當前記錄書籤的更改,表單將更新以加載該記錄的數據。動態集綁定到底層數據表,當表單的編輯緩衝區被保存時,編輯的數據被寫回到服務器。在進行編輯時,鎖可能會或可能不會保留在服務器上的記錄中,但Access/Jet/ACE確實會跟蹤服務器上現有記錄的狀態以及編輯緩衝區中的記錄,並會通知您如果服務器上的記錄載入窗體的編輯緩衝區後發生更改,則可以在Access中節省時間。

現在,在評論,你說的形式綁定到整個表。無論您的數據是存儲在Jet/ACE後端數據文件還是SQL Server等服務器數據庫中,這都是一個糟糕的設計。 Access可以逃脫的唯一原因是因爲它和Jet從數據源中提取數據相當有效。

我正確設計的客戶端/服務器訪問前端不會加載全表中的形式,而是問在什麼時間過濾要載入記錄,1個或更多的記錄。這比綁定整個表格稍微複雜一些。

至於知道正在使用哪些遊標類型,你不應該擔心。默認情況下,Access表單使用Access/Jet/ACE調用動態集。每個表單都有一個RecordsetType屬性,默認情況下它設置爲動態集(有關不同記錄集類型的含義,請參閱幫助文件)。如果你想要更多的控制,你可以(但可能不應該)在代碼中創建記錄集,並將它們分配給表單的.Recordset屬性。這在一些情況下非常有用,例如,當您想要將表單綁定到斷開連接的記錄集時,Access的重點就是利用其綁定數據的功能。指定自己的記錄集仍然可以獲得綁定控件和表單事件,但比通常需要的工作量更多。

基本上,改變你的表格只加載的用戶需要與工作記錄的子集(可能是一次一個記錄),然後讓別的一切都得到了與Access的默認行爲來完成。如果某件事情導致瓶頸,請排除故障並用更有效的方式替換默認行爲。

換句話說,避免過早優化 - 讓Access成爲Access。

不要擔心什麼訪問是做幕後的,除非/直到訪問做了不恰當的。

+0

@大衛 - 感謝您的建議和良好的信息。是的,這是一個非常糟糕的POS。噸的gotos,未定義的變量,糟糕的數據庫設計。例如,郵政編碼是浮動的。 表單綁定到整個表。因此,當用戶從記錄導航到記錄時,它顯示(從SQL事件探查器)Access從巨大的表中獲取主鍵的*整個列表。 我的關鍵問題是如何制止這種行爲。謝謝! – 2010-04-27 03:42:56

+0

@David - 另外,我問的原因是Access需要8+秒才能從表中的一條記錄移動到下一條記錄。我相信會發生這種情況,因爲每當用戶導航到表中的新記錄時,200k到800k的整數(表的主鍵)從後端SQL數據庫傳回到前端Access。這是一個足夠強大的服務器,能夠處理設計合理的數據庫,數量級更大(但沒有訪問前端垃圾)。 – 2010-04-27 03:53:04

+0

我很驚訝Jet會拉這麼多的數據。我一直認爲Jet會像使用自己的數據文件一樣使用Rushmore,就像使用ODBC數據源的「懶惰」檢索一樣。我不知道,因爲我從來沒有將Access窗體綁定到整個SQL Server表。我只用Jet/ACE後端的小桌子來做這件事。 – 2010-04-28 00:13:16