以编程方式访问“压缩和修复”

时间:2010-08-17 14:50:45

标签: ms-access repair

是否有可能以某种方式以编程方式“压缩和修复”Access数据库(使用ADOX,使用OleDbConnection等)?

7 个答案:

答案 0 :(得分:10)

我没有足够的回复回复之前的“回答”,但我想提供一些可能对其他人有关OP问题的信息。

我多年来一直使用JRO方法从VB.net压缩/修复我的Access 2000数据库。每一次在蓝色的月亮中,我都有一个设法破坏数据库的客户端(通常是通过网络连接到数据库并且他们遭受意外的网络中断)。 JRO(根据我的经验)工作正常,只要数据库没有被破坏。如果我使用Access应用程序执行此操作,我永远无法弄清楚为什么数据库可以修复,但是当使用MY应用程序(使用JRO)时,压缩/修复将始终失败(数据库处于无法识别的格式)。

所以,在一小时前遇到这个帖子后,我把DAO的引用放到了我的应用程序中,并尝试了修复损坏的数据库的能力,因为我今天有一个客户端损坏了他们的数据库(第三次发生在大约8年)。猜猜看,当JRO失败时,DAO能够修复数据库!

好的,这就是我对JRO vs. DAO的体验。希望能帮助到你。以下是使用DAO中的CompactDatabase的示例代码:

Dim dbCorrupt As String = "c:\CorruptedDB.mdb"
Dim dbRepaired As String = Path.Combine(Path.GetDirectoryName(dbPath), Path.GetFileNameWithoutExtension(dbPath) & "_Repaired.mdb")

Dim dao As New dao.DBEngine
dao.CompactDatabase(dbCorrupt, dbRepaired)

答案 1 :(得分:3)

它可以通过两种方式压缩和修复MS ACCESS数据库:

  • 使用DAO:在DAO350中有一个方法RepairDatabase(),而在DAO360中有CompactDatabase()
  • 使用MDAC + JRO:

例如,在VB6(旧的,旧的,旧的......)中这样做:

Dim jro As jro.JetEngine
Set jro = New jro.JetEngine
jro.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db_to_repair.mdb;Jet OLEDB:Database Password=mypass", _ 
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\repaired_db.mdb;Jet OLEDB:Engine Type=4;Jet OLEDB:Database Password=mypass"

正如您将注意到的,该函数要求您指定要修复的数据库的名称以及已修复数据库的名称。

答案 2 :(得分:3)

c#.net

中只有四行代码

首先使用库:

using JRO;

您希望使用以下代码压缩和修复test.mdb

string currentdirectory = System.IO.Directory.GetCurrentDirectory();
string oldmdbfile = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + currentdirectory + "\\test.mdb;Jet OLEDB:Database Password='xyz'";
string newmdbfile = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + currentdirectory + "\\test1.mdb;Jet OLEDB:Database Password='xyz'";
string oldmdbfilepath = currentdirectory + "\\test.mdb";
string newmdbfilepath = currentdirectory + "\\test1.mdb";

JRO.JetEngine engine = new JetEngine();
engine.CompactDatabase(oldmdbfile, newmdbfile);
File.Delete(oldmdbfilepath);
File.Move(newmdbfilepath, oldmdbfilepath);
MessageBox.Show("Database compact and repaired successfully !",);

因此,test.mdb将被压缩和修复,并将创建一个新文件test1.mdb。然后,您只需删除test.mdb并将test1.mdb重命名为test.mdb

答案 3 :(得分:2)

VBScript的示例代码。

Dim objEngine
Dim objProcess
'Dim objDB
Dim strDb1

Dim strPath
Dim strFile
Dim strDAOversion
Dim strApplicationName
Dim strErr

Dim strMsg
Dim FSO

strPath = "C:\Docs\"

strFile = "Some.mdb"
strDb1 = strPath & strFile

Set FSO=CreateObject("Scripting.FileSystemObject")

strDAOversion = "DAO.DBEngine.36"
strApplicationName = "Some.mdb"

strMsg = "About to perform a COMPACT on "
strMsg = strMsg & chr(10) & chr(10)
strmsg = strMsg & strApplicationName
strMsg = strMsg & chr(10) & chr(10)
strmsg = strmsg & "Please ask everyone to EXIT THE SYSTEM."
strMsg = strmsg & chr(10) & chr(10)
strmsg = strmsg & space(12) & "It is VITAL you do not exit windows until"
strMsg = strMsg & chr(10)
strMsg = strMsg & space(12) & "you receive the confirmation message."
strMsg = strmsg & chr(10) & chr(10)
strMsg = strMsg & space(6) & "Press OK to continue or Cancel to stop the process."


If MsgBox(strMsg, 1, strApplicationName) = 1 Then

  Set objEngine = WScript.CreateObject(strDAOversion)

  Call CompactDB(FSO, objEngine, strDb1, "password")

  If strErr="True" Then
    strMsg = "Please correct the problem and try again."
    MsgBox strMsg, 1, strApplicationName
  Else
    strMsg = "Database compacting complete."
    MsgBox strMsg, 1, strApplicationName
  End If
End If


Function CompactDB(objFSO, objEngine, strDb, pwd)

'Compact the database

Dim strdbtemp
Dim MsgText

strdbtemp = Left(strDb, Len(strDb) - 3) & "ldb"

If FSO.FileExists(strdbtemp) = True Then 'if ldb file exists, db is still open.
MsgText = "You have not exited the file. Please close and try again."
MsgBox MsgText, 1, strApplicationName
strErr="True"
Exit Function
End If

If FSO.FileExists(strDb1) = False Then
MsgText = "Cannot locate the database at " & strDB
MsgBox MsgText, 1, strApplicationName
strErr="True"
Exit Function
End If

strdbtemp = Left(strDb, Len(strDb) - 3) & "tmp"

If pwd = "" Then
objEngine.CompactDatabase strDb, strdbtemp
Else
objEngine.CompactDatabase strDb, strdbtemp, , , ";pwd=" & pwd
End If

If Err = 0 Then
FSO.deletefile strDb
FSO.copyfile strdbtemp,strDb
FSO.deletefile strdbtemp
Else
MsgText = "Error during COMPACT process for " & strDB
MsgBox MsgText, 1, strApplicationName
strErr="True"
End If

End Function

答案 4 :(得分:1)

此解决方案适用于Access 2010数据库引擎:

必填参考:

Microsoft.Office.interop.access.dao

代码:

public void CompactDb(
    string sourceFilePath, string destFilePath, string password)
{
    var dbEngine = new Microsoft.Office.Interop.Access.Dao.DBEngine();

    dbEngine.CompactDatabase(sourceFilePath, destFilePath,
        ";pwd=" + password, null, ";pwd=" + password);
}

(sourceFilePath和destFilePath不应该相同!)

CompactDatabase方法参数(来自反射):

void CompactDatabase(
    string SrcName, string DstName,
    object DstLocale = Type.Missing,
    object Options = Type.Missing,
    object SrcLocale = Type.Missing);

确保在与安装的AccessDatabaseEngine(或Office)相同的平台上运行它(x86 / x64)。

答案 5 :(得分:0)

  

将ref添加到:Microsoft ActiveX Data Objects 2.x Library Microsoft Jet   和复制对象2.x库

sDB = "c:\DB\myDb.mdb"
sDBtmp = "c:\DB\tempMyDb.mdb"
sPASSWORD = "password"

Dim oApp As Access.Application
Set oApp = New Access.Application
Call oApp.DBEngine.CompactDatabase(sDB, sDBtmp, dbLangGeneral, , ";pwd=" & sPASSWORD)

'wait for the app to finish
        DoEvents
'remove the uncompressed original
        Kill sDB
'rename the compressed file to the original to restore for other functions
        Name sDBtmp As sDB

答案 6 :(得分:0)

这是官方的MS链接,任何进一步的评论都是多余的。 DBEngine.CompactDatabase Method