PDA

Ver la Versión Completa : Compactar MDB con contraseña


pgraciap
05-05-2003, 18:59:06
Alguien sabe como compactar una base de datos de access con contraseña, ya tengo el codigo de compactacion este se encuentra en los trucos de club, este compacta muy bien las bases de datos que no tienen contraseña, pero las que si tienen nada mas no las repara y compacta.....

alguien me podria decir cual es el truco..... :)

Saludos y gracias.....;)

Rox77
06-05-2003, 10:41:26
Hola PgraciaP, yo he probado el codigo para compactar bases de datos mdb q hay en el foro y me ocurrio lo mismo con una bd con contraseña...la funcion que usas para compactar tiene un parametro el cual es para introducir la contraseña de la bd...si quieres mas detalles busca en la ayuda de VBA de Access 97 hay lo encontre yo. Esq ahora mismo no me acuerdo de como es exactamente pero si quieres me lo dices y te mando un ejemplo.

delphi.com.ar
07-05-2003, 01:56:06
Aunque pese informarlo, tuve que abrir Visual Basic para ver como lo había hecho ya hace unos años, pero obviamente en Visual Basic es mucho mas natural utilizar DAO, ahí va el código, lo probé y funciona, hay que tener en cuenta que el password es Case Sesitive.

uses
ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
DBEngine : OLEVariant;//IDispatch;
begin
DbEngine := CreateOleObject('Dao.DbEngine.36');
DbEngine.CompactDataBase('C:\db1.mdb', 'C:\db2.mdb', NULL, 0, ';pwd=password');
end;

pgraciap
07-05-2003, 16:56:27
Nota importante hay que poner en cualquiera de las clausulas USES, comobj.

Con esto ya algunos tendremos como terminar nuestro, proposito de compactar las bases de datos con contraseña.

Para compactar una Base de Datos en Access

var Dir: string; // contiene el directorio
// en dónde se encuentra el fichero de datos


function GetEngine(var DbEngine: Variant): Boolean;
begin
Result := False;
try
DbEngine := CreateOleObject('Dao.DbEngine.35'); // Para Access'97
except
try
DbEngine := CreateOleObject('Dao.DbEngine.36'); // Para Access 2000
except
ShowMessage('No es posible inicializar el DAO.'#13 +
'Microsoft DAO debe de estar instalado en este equipo.'#13 +
'Para instalarlo, debes saber que forma parte de '+
'MS Access, Visual Basic, MS Office, etc.');
Exit;
end;
end;
Result := VarType(DbEngine) = VarDispatch;
end;


function CompactDataBaseDao(DbAccessName: String): Boolean;
var
DbEngine: Variant;
TmpFile: String;
begin
Result := False;
if Dir = '' then Exit;
TmpFile := Dir + 'TmpAccess.Mdb';
if Pos( '.MDB', UpperCase(DbAccessName)) = 0 then
DbAccessName := DbAccessName + '.MDB';
if not FileExists(DbAccessName) then Exit;
try
if not GetEngine(DbEngine) then Exit;
if FileExists(TmpFile) then
DeleteFile(TmpFile);
// Antes de compactar la Base de Datos, ésta se repara.
DbEngine.CompactDataBase(DbAccessName, TmpFile);
DeleteFile(DbAccessName);
RenameFile(TmpFile, DbAccessName);
// En caso de caida del sistema aquí, tendremos la base compactada en TmpFile.
Result := True;
except
Exit;
end;
end;

Nota:
Esta parte es para compactar las mdb sin contraseña:
DbEngine.CompactDataBase(DbAccessName, TmpFile);.
Y esta otra es para las que tienen contraseña:
DbEngine.CompactDataBase(DbAccessName, TmpFile, NULL, 0, ';pwd=password');.

Esta ultima parte es gracias a nuestros amigos: delphi.com.ar y Rox77.

Espero les funcione a mucha gente al igual que a un servidor... :D
Saludos y Gracias.....

davezf
20-03-2005, 23:42:47
Hola,

Lo he probado y me funciona correctamente en Windows XP, pero al compactar con Windows Millenium me da un error. Alguien sabe por que?

delphi.com.ar
21-03-2005, 13:37:22
Sería buenísimo saber cuál es el error ;)

davezf
21-03-2005, 18:02:30
Mejor si;)

Explico un poco mejor. El ordenador del cliente tiene Windows Millenium y Office XP. La base de datos tiene contraseña. Entonces el error se produce al compactar la base de datos (Datatype conversion error). Pero si lo compacto desde access no hay ningun problema.

davezf
03-04-2005, 12:17:57
Lo explico mas detalladamente, a ver si alguien encuentra la solucion.

Uso el codigo indicado por pgraciap. Entonces cuando ejecuta la linea
DbEngine.CompactDataBase(DbAccessName, TmpFile, NULL, 0, ';pwd=password');

me indica el error "Datatype conversion error"

Alguien tiene una solucion? En XP funciona perfectamente y desde access con cualquier version funciona bien.

pgraciap
05-04-2005, 22:27:13
Ya probaste instalar las actualizaciones del DAO/Access podrias dar un poco mas de datos en cuanto a error???

Saludos...

davezf
06-04-2005, 12:14:52
DAO / Access se instala con la aplicacion y es el version 2.5 (la que he encontrado).

No se que mas explicar del error porque no se mas aparece ese error al compactar la base de datos, pero si la compacto con access todo funciona bien.