Доступ к "Компакт и ремонт" программно

Можно ли каким-то образом программно "сжать и исправить" базу данных Access (используя ADOX, OleDbConnection и т. Д.)?

7 ответов

Решение

У меня недостаточно представителя, чтобы ответить на предыдущий "ответ", но я хотел предоставить некоторую информацию, которая может быть полезна для кого-то еще в отношении вопроса ОП.

Я годами использовал метод JRO для сжатия / восстановления баз данных Access 2000 с VB.net. Каждый раз в голубой луне у меня есть клиент, которому удалось повредить базу данных (обычно при подключении к базе данных по сети, и они страдают от неожиданного прерывания сети). JRO (по моему опыту) работает нормально, пока база данных не повреждена. Я никогда не мог понять, почему база данных МОЖЕТ быть восстановлена, если я использую приложение Access для этого, но при использовании приложения MY (которое использует JRO) сжатие / восстановление всегда будет неудачным (база данных находится в нераспознанном формате).

Итак, после того, как я натолкнулся на эту тему всего час назад, я добавил ссылку на DAO в свое приложение и опробовал ее способность восстанавливать поврежденную базу данных, поскольку только сегодня у меня был клиент, повредивший свою базу данных (в третий раз это произошло примерно за 8 лет).). Угадайте, что DAO удалось восстановить базу данных, когда JRO не удалось!

Итак, это мой опыт с JRO vs. DAO. Надеюсь, поможет. Вот пример кода для использования CompactDatabase от DAO:

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)

Это просто четыре строки кода в 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,

Возможно сжатие и восстановление базы данных 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"

Как вы заметите, функция требует, чтобы вы указали имя базы данных, которую нужно восстановить, и имя восстановленной базы данных.

Пример кода для 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

Это решение работает с ядром базы данных 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).

Вот официальная ссылка MS, любые дальнейшие комментарии будут излишними. Метод DBEngine.CompactDatabase

Добавить ссылку на: Объекты данных Microsoft ActiveX 2.x Библиотека 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
Другие вопросы по тегам