2010-03-11 42 views
4

我有一個龐大的數據庫(800MB),它包含一個名爲'Date Last Modified'的字段,此字段作爲文本數據類型輸入時需要將其更改爲一個日期/時間字段來執行一些查詢。無法更改MS Access 2007上的數據類型

我還有一個完全相同的數據庫,但它裏面的數據只有35MB,當我改變它工作正常,數據類型,但是當我嘗試在大型數據庫的更改數據類型,它給了我一個錯誤:

Micorosoft Office Access can't change the data type. 

There isn't enough disk space or memory 

做一些研究更改註冊表文件(MaxLocksPerFile)提到一些網站嘗試過爲好,但沒有運氣:-(

誰能幫助嗎?

+0

您是否嘗試過使用相同的字段創建一個新的表格,但'Date Last Modified'是datetime類型。這張新表不應該有任何索引。用附加查詢將數據追加到新表中。 – Fionnuala 2010-03-11 23:51:57

+0

抱歉不太清楚你的索引是什麼意思:s 數據是在我用來導入到Access的CSV文件中,它沒有讓我設置數據類型,然後在導入級別上也是同樣的問題。 – 2010-03-12 00:02:11

+0

如果你不知道索引是什麼,你可能沒有一個:)請發佈兩個或三個日期來顯示格式,謝謝。 – Fionnuala 2010-03-12 00:11:32

回答

1

一個比較繁瑣(但簡單明瞭)的解決方案是將大數據庫分解成更小的數據庫,在較小的數據庫上進行轉換,然後重新組合它們。

這有一個額外的好處,即如果在某個塊中文本是無效的日期,那麼它會更容易找到(因爲塊大小更小)。

假設你有某種對範圍從1到(比方說)千萬表整數關鍵的,你可以不喜歡

SELECT * 
INTO newTable1 
FROM yourtable 
WHERE yourkey >= 0 AND yourkey < 1000000 

SELECT * 
INTO newTable2 
FROM yourtable 
WHERE yourkey >= 1000000 AND yourkey < 2000000 

查詢請確保輸入和運行這些查詢是分開的,因爲如果您嘗試一次運行多個查詢,Access似乎會給您一個語法錯誤。

如果你的鑰匙是別的東西,你可以做同樣的事情,但是你必須對你的WHERE子句有點棘手。

當然,如果你能擺動它,最後要考慮的是遷移到具有更多功能的不同數據庫。我猜你有理由認爲這並不容易,但是由於你談論的數據量很大,你可能會遇到其他問題以及繼續使用Access。

編輯

既然你仍然有一些麻煩,在這裏是希望,你會看到的東西,之前我沒有描述不夠好一些細節:

在這裏,你可以看到我創建了一個類似於您所描述的「OutputIDrive」表。我有一個ID標籤,但我只有三個條目。 alt text http://www.freeimagehosting.net/uploads/2829dbd2d3.png

在這裏,我創建了一個查詢,進入了SQL模式,並輸入了相應的SQL語句。在我的情況下,因爲我的查詢只抓取值> = 0和< 2,我們只會得到一行... ID = 1的行。 alt text http://www.freeimagehosting.net/uploads/16e6e0dbc2.png

當我點擊運行按鈕,我得到一個彈出窗口告訴/警告我會發生什麼......它將把一行放到一個新表中。這很好...這就是我們正在尋找的。我點擊「確定」。 alt text http://www.freeimagehosting.net/uploads/319e58d763.png

現在我們的新表已經創建好了,當我點擊它時,我們可以看到我們的ID = 1的一行數據已經被複制到這個新表中。現在
alt text http://www.freeimagehosting.net/uploads/f7fd0aad82.png

,你應該能夠只是修改表名和您的SQL查詢的數量值,並重新運行。

希望這會幫助你,不管你絆倒。

編輯2:

啊哈!這是一個竅門。您必須在Access中一次輸入並運行一條SQL語句。如果你試圖把在多條語句並運行它們,你會得到錯誤。這樣跑第一個,然後刪除它,然後運行第二個,等你應該罰款。我認爲這會做到!我編輯了上述內容以使其更清晰。

+0

對不起,當談到SQL時,我是一個新手的升技。我的表被稱爲'OutputIDrive'mykey是'ID',它的範圍從0> 1325210我怎樣才能把它放到SQL?我試着改變你的源代碼,但在查詢表達式'ID> = 0 AND ID <662605'中得到'語法錯誤'謝謝你的幫助。 – 2010-03-11 22:27:33

0

這是完全有可能在一個數據庫後這個尺寸,你有文字數據不會轉換爲有效的日期/時間。

我會建議(你可能會討厭我),你將所有這些預期的日期值從「Big」中導出,並通過它們(可能在Excel中)來查看哪些未按照您的期望格式化。

+0

夠搞笑,我居然有! :( 數據庫中的數據已經自動生成,並且全部都是日期類型 至於excel,起初我試圖用Excel打開它,但Excel有最大數量的單元格,我想大約1.2百萬,這個數據超過了:( – 2010-03-11 22:16:57

+0

)我可以建議你的數據從Access遷移到SQL Express或其他東西嗎?這是一個瘋狂的大量數據信任訪問。 – 2010-03-11 22:28:13

+0

這將是一個好主意,但我是一個完整的新手當涉及到除Access之外的任何數據庫時,但是如果將這個數據庫轉換爲SQL的簡單步驟將會很棒。 – 2010-03-11 22:30:35

0

假設錯誤消息是準確的,你對磁盤或存儲限制跑起來。假設你有超過兩磁盤驅動器上GB的更多,我最好的猜測是,重建表會把數據庫(包括工作空間)在訪問中每個文件限制2千兆字節。

如果這是你需要的情況下:

  1. 卸載數據到一些方便的格式,並與已經存在的表定義加載回一個空數據庫。

  2. 移動數據的子集到一個較小的表,改變數據類型在較小的表,緊湊和修復數據庫,並重復,直到所有的數據被轉換。

如果錯誤消息不正確(這是可能的),最可能的原因是文本日期列中的錯誤或超出範圍的日期。

0
  1. 複製表格(即'YourTable'),然後將其結構以不同的名稱(即'YourTable_new')粘貼到數據庫中。

  2. 將新表中的字段更改爲所需內容並保存。

  3. 創建一個附加查詢並將舊錶中的所有數據複製到新的查詢中。

希望Access會自動將舊文本字段直接轉換爲新日期/時間字段的正確值。如果不是,則可能必須清除舊錶並重新附加所有數據,並在執行追加操作時使用字符串到日期函數來轉換該字段。

此外,如果舊錶中存在自動編號字段,則可能無法工作,因爲無法確保舊的自動編號值與新分配的自動編號值對齊。

+0

咦?當然,您可以保留相同的自動編號值。只需將舊的自動編號字段附加到新的自動編號字段。 Jet/ACE自動編號數據類型只是一個具有特殊類型默認值的長整型字段(以及一些其他限制,例如創建記錄後不可編輯),因此您可以將任何值附加到只要它不違反現有數據的索引,就可以創建新記錄。 – 2010-03-12 18:29:29

0

您已經獲得了一堆不同的方式來解決磁盤空間不足的錯誤消息。

你有沒有嘗試添加一個新的領域,以現有的表使用日期數據類型,然後用值現有的字符串日期字段更新領域?如果可行,則可以刪除舊字段並將新字段重命名爲舊名稱。這可能會佔用較少的臨時空間,而不是直接從字符串到單個字段的日期轉換。

如果仍然無法正常工作,您可以用兩列,第一個長整型(使其主鍵),第二,日期與sceond表來做到這一點。然後將PK和字符串日期字段附加到此空表中。然後將新的日期字段添加到現有表中,並使用連接,使用兩列表中的值更新新字段。

這可能會遇到同樣的問題。它取決於我們無法控制的Jet/ACE數據庫引擎內部數量。

1

我剛剛有這個問題。

磁盤空間和可用內存都很好。經過

問題就走了「壓縮和修復」。

巧合?

e。

3

由於John W. Vinson says here,您遇到的問題是,Access想要在進行更改時保留表的副本,並導致它超出Access文件的最大允許大小。壓縮和修復可能有助於獲得文件大小的限制,但它不適合我。

如果像我一樣,你有很多複雜的關係和舊錶報告的,你不希望有重做,嘗試,而不是對@ user292452的解決方案這種變化:

  1. 複製表格(例如'YourTable'),然後將Structure Only 粘貼到您的數據庫中,使用不同的名稱(即'YourTable_new')。
  2. 複製YourTable又和粘貼數據,追加到YourTable_new。 (要粘貼-追加,第一貼,並選擇追加數據到現有 表。)
  3. 你可能想在這一點上,讓您的Access數據庫的副本, 以防萬一出問題時的一個部分。
  4. 刪除所有數據YourTable使用刪除查詢---選擇所有 領域,使用星號,然後用默認設置運行。
  5. 現在,您可以根據需要在YourTable更改字段並再次保存 。
  6. 粘貼數據從YourTable_newYourTable,並檢查 從類型轉換,長度等沒有錯誤。
  7. 刪除YourTable_new
+1

在步驟5中,編輯*原始*表格,不是嗎? – Andre 2016-02-03 17:21:05

+0

@安德魯,謝謝---現在修好了。 – caedocyon 2016-04-20 16:39:30

1

Karl Donaubauer's answer上的MSDN交改編:

  • 切換到即時窗口(CTL + G)
  • 執行以下語句:

    DBEngine.SetOption dbMaxLocksPerFile,200000


微軟有一個KnowledgeBase article直接解決這個問題,並介紹了原因:

The page locks required for the transaction exceed the MaxLocksPerFile value, which defaults to 9500 locks. The MaxLocksPerFile setting is stored in the Windows registry.

的知識庫文章說,它適用於Access 2002和2003年,但它從一個.mdb更改字段時,工作對我來說Access 2013.