Доступ к "Компакт и ремонт" программно - PullRequest
7 голосов
/ 17 августа 2010

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

Ответы [ 7 ]

10 голосов
/ 26 января 2014

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

Я использовалметод 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)
3 голосов
/ 28 декабря 2011

Это всего четыре строки кода в 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 голосов
/ 19 августа 2010

возможно сжатие и восстановление базы данных 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 голосов
/ 19 августа 2010

Пример кода для 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
1 голос
/ 24 октября 2013

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

0 голосов
/ 26 июня 2015

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

0 голосов
/ 11 февраля 2013

Добавить ссылку на: объекты данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...