2010-06-27 64 views
0

我有一個使用傳統ASP和Access 2007格式(.accdb)數據庫的網站。它使用密碼進行加密,文件大小約爲300 MiB。如何自動壓縮和修復Access 2007數據庫?

該網站本身工作正常,但時不時會數據庫被損壞(錯誤是「無法識別的數據庫格式」)。它可以通過在MS Access中打開數據庫很容易修復,然後它將被修復。問題是,我可能需要幾天時間纔會發現數據庫已損壞,在此期間該站點將無用。有時在每次腐敗之間需要幾個月,其他時間只需一兩週。

我希望網站能夠每隔一段時間(每天一次)調用「壓縮和修復數據庫」功能,以保持數據庫處於工作狀態。

我的問題是我該如何做到這一點,使其自我修復?

我發現這篇文章:How do I compact and repair an ACCESS 2007 database by .NET code? ...但我不明白我怎麼能爲我做這項工作。我只知道經典的ASP和Java。

任何人都可以寫一個小小的隔離式ASP代碼來實現這個功能:「打開連接到受密碼保護的數據庫」,「修復數據庫」,「關閉連接」。

網站和數據庫位於專用服務器上,我可以完全控制,因此我可以實施任何存在的解決方案。

非常感謝!

+0

1. Jet/ACE不是適合網站的數據存儲。 2.數據庫密碼無論用於任何目的都毫無用處。如果它反覆破壞數據庫,你顯然會在操作環境中出現嚴重錯誤。您可以花時間排除故障並修復它,也可以做正確的事情並切換到適合此用途的數據存儲。 – 2010-06-27 22:17:38

+0

雖然我很感激你花時間寫評論,但你給的指針與我的問題完全無關。使用Access的網站已經有很多年了,我沒有時間重寫任何代碼,我只想要一個可行的解決方案。 – Mike 2010-06-28 14:04:00

+0

祝你好運。 – 2010-06-28 20:11:12

回答

0

我得到了我所需要的另外一個問題我問了答案: Why can't I use "CompactDatabase" in DAO.DBEngine.36 using VBscript?

「HansUp」 給了我下面的代碼的用戶:

Dim objFSO 
Dim objEngine 
Dim strLckFile 
Dim strSrcName 
Dim strDstName 
Dim strPassword

strLckFile = "C:\Access\webforums\foo.laccdb" strSrcName = "C:\Access\webforums\foo.accdb" strDstName = "C:\Access\webforums\compacted.accdb" strBackup = "C:\Access\webforums\foobackup.accdb" strPassword = "foo"

Set objEngine = CreateObject("DAO.DBEngine.120")

Set objFSO = CreateObject("Scripting.FileSystemObject") If Not (objFSO.FileExists(strLckFile)) Then If (objFSO.FileExists(strBackup)) Then objFSO.DeleteFile strBackup End If If (objFSO.FileExists(strDstName)) Then objFSO.DeleteFile strDstName End If objFSO.CopyFile strSrcName, strBackup

''dbVersion120 = 128 
objEngine.CompactDatabase strSrcName, strDstName, , 128, ";pwd=" & strPassword 

objFSO.DeleteFile strSrcName 
objFSO.MoveFile strDstName, strSrcName 

結束如果「LckFile

(由於某種原因,當我複製代碼時,代碼有一些額外的換行符,請點擊本文開頭的鏈接,查看代碼的一些更簡潔的版本如果你想。)

它壓縮一個Access 2007數據庫到Access 2007數據庫(無格式轉換),也修理任何損壞(不一致的狀態),在數據庫中!正是我在找的東西。=)

0

您可以編寫一個腳本來不時修復數據庫。但有兩個問題:

1)如何檢測數據庫已損壞 2)如何最大限度地減少數據丟失。

最大的問題是您正試圖修復存在於訪問數據庫本身內部的問題(頻繁的數據損壞)。因此,該產品不適合任何嚴重的應用。那麼爲什麼你不切換到更可靠的數據庫呢? (MS SQL,MYSQL,ORACLE,SQL Lite等等)。

+1

沒有必要檢測損壞的數據庫。壓縮Jet/ACE數據庫首先檢測是否存在需要修復的問題,如果沒有,則跳過修復步驟並壓縮文件(重寫連續數據文件中的數據和索引頁並丟棄未使用的數據頁並更新所有統計和內部指針等)。 「不適合任何嚴肅的申請」只是公然的偏執和錯誤。如果我能爲此倒下10次,我會這樣做。您顯然缺乏判斷Jet/ACE數據存儲的正確使用和維護的資格。 – 2010-06-27 22:15:44

+0

「不適合任何嚴重的應用程序」是錯誤的。在許多情況下,這種情況並不合適,比如在具有大量更新/插入的網站上。但它非常適合嚴重的應用。 – 2010-06-27 23:12:36

+0

如果我只是想要這樣做,如果數據庫已損壞我可以簡單地捕捉任何使用錯誤,如果錯誤消息是「無法識別的數據庫格式」,我會知道它已損壞,並可以啓動修復。順便說一句,你忘了在你的答案中寫下最重要的東西,我實際上是怎麼「編寫一個腳本來不時修復數據庫」。這就是我在這裏問的。 ;)所以請用我需要的代碼寫一個註釋,將會非常感謝! – Mike 2010-06-28 14:13:25

0

SQL Server Express可以合法授權在Web服務器上使用嗎?如果是這樣,我建議將數據移到它。如果沒有其他選項提到其他選項。在接下來的頁面SQL Server 2008 Express中,我看到提到Web平臺安裝程序,因此您可以在Web服務器上使用它。但是我不解釋EULA,所以我把這個決定留給你。

+0

感謝您的評論,但是我只對直接解決我的問題感興趣。 – Mike 2010-06-28 14:05:02