Pregunta Acceda programáticamente a "Compactar y reparar"


¿Es posible "compactar y reparar" una base de datos de Access de una manera programática (usando ADOX, usando OleDbConnection, etc.)?


5
2017-08-17 14:50


origen


Respuestas:


No tengo suficiente representante para responder a una "respuesta" anterior, pero quería proporcionar información que podría ser útil para otra persona con respecto a la pregunta del OP.

He estado usando el método JRO durante años para compactar / reparar mis bases de datos de Access 2000 desde VB.net. Cada vez que en una luna azul, tengo un cliente que ha logrado corromper una base de datos (generalmente cuando está conectado a la base de datos a través de una red y sufren una interrupción de red inesperada). JRO (en mi experiencia) funciona bien, siempre y cuando la base de datos NO ESTÉ CORRUPTADA. Nunca pude averiguar por qué la base de datos PODRÍA repararse si utilicé la aplicación Access para hacerlo, pero cuando uso MI aplicación (que usa JRO), el compacto / reparación siempre fallaría (la base de datos está en un formato no reconocido).

Entonces, después de encontrar este hilo hace una hora, dejé una referencia a DAO en mi aplicación y probé su capacidad para reparar una base de datos corrupta ya que hoy tuve un cliente que corrompió su base de datos (la tercera vez ocurrió en aproximadamente 8 años) ) Adivina qué, ¡DAO pudo reparar la base de datos cuando JRO falló!

OK, así que esa es mi experiencia con JRO vs. DAO. Espero eso ayude. Aquí hay una pieza de código de muestra para usar CompactDatabase de 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)

8
2018-01-26 07:26



es posible compactar y reparar una base de datos MS ACCESS de dos maneras:

  • usando DAO: en DAO350 hay un método RepairDatabase(), mientras que en DAO360 hay CompactDatabase() 
  • usando MDAC + JRO:

Como ejemplo, en VB6 (viejo, viejo, viejo ...) haz esto:

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"

Como notará, la función requiere que especifique el nombre de la base de datos a reparar y el nombre de la base de datos reparada.


3
2017-08-18 21:41



Son solo cuatro líneas de código en c # .net

Primero usa una biblioteca:

using JRO;

Desea compactar y reparar test.mdb con el siguiente código:

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 !",);

Así test.mdb Será compactado y reparado y un nuevo archivo. test1.mdb se creará. Entonces solo tienes que borrar test.mdb y renombrar test1.mdb a test.mdb.


3
2017-12-28 10:12



Código de muestra para 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

2
2017-08-18 22:06



Esta solución funciona con el Motor de base de datos de Access 2010:

Referencia requerida:

Microsoft.Office.interop.access.dao

Código:

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 y destFilePath no deberían ser lo mismo!)

Parámetros del método CompactDatabase (de la reflexión):

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

Asegúrese de ejecutarlo en la misma plataforma que AccessDatabaseEngine (u Office) que instaló (x86 / x64).


1
2017-10-24 14:28



Agregue ref a: Microsoft ActiveX Data Objects 2.x Biblioteca Microsoft Jet   y Replication Objects 2.x Library

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

0
2018-02-11 06:20



Aquí está el enlace oficial de MS, cualquier comentario adicional sería redundante. Método DBEngine.CompactDatabase


0
2018-06-26 12:16