PDA

Ver la Versión Completa : Guardar y restaurar mi base de datos. Ayuda!


salDer
01-02-2007, 14:13:07
Hola, tengo un proyecto de gestion realizado en turbo delphi,para empezar decir que no tengo mucha idea de como usar delphi, y tengo que hacer/restaurar la copia de seguridad de la base de datos de mi proyecto.
Tengo un menu de inicio, en el cual tengo el menu desplegable de copia de seguridad, dentro de este menu tengo "Hacer" y "Restaurar", al hacer click en "Hacer" necesito que me guarde lo que tengo en mi archivo .gdb en un archivo seleccionado manualmente. Por el contrario, al hacer click en "Restaurar" quiero carga en mi archivo .gdb lo que tenga en un archivo seleccionado manualmete.
Os rogaria que me hechaseis una mano. Un saludo.

Bicho
01-02-2007, 14:28:55
Hola bienvenido al ClubDelphi!

Antes que nada, échale un vistazo a la Guía de Estilo (http://www.clubdelphi.com/foros/guiaestilo.php) y verás que tú pregunto no debe ir en este foro, sino mejor en el de Bases de datos.
Tambien puedes usar el buscador (http://www.clubdelphi.com/foros/search.php) antes de postear por si este tema ya se ha tratado otras veces.

En cuanto a tu pregunta, tienes varias opciones:

1 - Copiar el fichero de la base de datos (.gdb) de la ruta de origen a la de destino. Para ello debes asegurarte de que no haya ninguna conexión abierta o activa sobre esa base de datos. Así que de primeras los componentes IbDatabase, IbTable, IbQuery, etc que tengas para conectarte, deben estar con la propiedad Active := False y/o (según el componente) connected := False o usar el método Close para cerrar las conexiones de cada uno.
Una vez desconectado, puedes usar las funciones CopyFile (unit Windows) o tambien MoveFile y MovoFileEx (tambien en la unit windows).
Ejemplo:


function Backup(origen, destino :string) : String;
begin
//Primero desconectamos todo
Ibtable1.Close;
IbDataBase1.Connected := False; //o IbDataBase1.Disconnect;

//intentamos copiar el fichero
copyfile(origen, destino, False); //El ultimo parametro indica si queremos para si el fichero de destino existe o no. Ponemos false y reescribe el fichero
end;


2 - Usando los componentes de backup-restore que existen por ahí y que dudo que vengan en TurboDelphi, ya que lo desconozco por completo (aun no lo he instalado)

Saludos

salDer
01-02-2007, 14:49:44
Muchas gracias por la ayuda, no estoy seguro de haberlo entendido todo, pero voy a hecharle un ojo a ver que sale, si tengo alguna duda la posteo en el tema de base de datos.

salDer
01-02-2007, 15:36:19
Hola bienvenido al ClubDelphi!

Antes que nada, échale un vistazo a la Guía de Estilo (http://www.clubdelphi.com/foros/guiaestilo.php) y verás que tú pregunto no debe ir en este foro, sino mejor en el de Bases de datos.
Tambien puedes usar el buscador (http://www.clubdelphi.com/foros/search.php) antes de postear por si este tema ya se ha tratado otras veces.

En cuanto a tu pregunta, tienes varias opciones:

1 - Copiar el fichero de la base de datos (.gdb) de la ruta de origen a la de destino. Para ello debes asegurarte de que no haya ninguna conexión abierta o activa sobre esa base de datos. Así que de primeras los componentes IbDatabase, IbTable, IbQuery, etc que tengas para conectarte, deben estar con la propiedad Active := False y/o (según el componente) connected := False o usar el método Close para cerrar las conexiones de cada uno.
Una vez desconectado, puedes usar las funciones CopyFile (unit Windows) o tambien MoveFile y MovoFileEx (tambien en la unit windows).
Ejemplo:


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
function Backup(origen, destino :string) : String;
begin
//Primero desconectamos todo
Ibtable1.Close;
IbDataBase1.Connected := False; //o IbDataBase1.Disconnect;

//intentamos copiar el fichero
copyfile(origen, destino, False); //El ultimo parametro indica si queremos para si el fichero de destino existe o no. Ponemos false y reescribe el fichero
end;





2 - Usando los componentes de backup-restore que existen por ahí y que dudo que vengan en TurboDelphi, ya que lo desconozco por completo (aun no lo he instalado)

Saludos

Hola, el comando copyfile no es exactamente lo que yo keria, ya que yo keria seleccionar el destino con un SaveDialog o algo por el estilo.
Y ¿Cual es la herramienta con la cual hago que salga una barra de progreso?, ya que al ejecutarse el copyfile no hace nada visual. Es simplemente para hacer notar que se ha guardado el archivo.

Bicho
01-02-2007, 21:36:19
Hola

ya que yo keria seleccionar el destino con un SaveDialog o algo por el estilo.
Y ¿Cual es la herramienta con la cual hago que salga una barra de progreso?, ya que al ejecutarse el copyfile no hace nada visual. Es simplemente para hacer notar que se ha guardado el archivo.

Haberlo dicho antes!! Revisa este (http://www.clubdelphi.com/foros/showthread.php?t=4761) hilo para la barra de progreso.

Y si quieres usar un cuadro de dialogo usa de la pestaña dialogs (de componentes) el componente SaveDialog y coges la propiedad SaveDialog1.FileName como parametro de destino para el fichero.

Espero te sirva.

Saludos

salDer
02-02-2007, 01:17:49
Hola


Haberlo dicho antes!! Revisa este (http://www.clubdelphi.com/foros/showthread.php?t=4761) hilo para la barra de progreso.

Y si quieres usar un cuadro de dialogo usa de la pestaña dialogs (de componentes) el componente SaveDialog y coges la propiedad SaveDialog1.FileName como parametro de destino para el fichero.

Espero te sirva.

Saludos

Hola, bueno primero darte las gracias por molestare, pero aun tengo un problema, esto es el codigo de mi procedimiento:
SaveDialogCopiaSeguridad.Execute;
copyfile('gpsM10-A.gdb', SaveDialogCopiaSeguridad.FileName , False);

y ahora me da un fallo de imcompatibilidad de tipos, especificando:
[Pascal Error] UnitPrincipal.pas(90): E2010 Incompatible types: 'TFileName' and 'PAnsiChar', supongo que sera una tonteria, te agradeceria que me lo solucionases, gracias.
Lo de la barra de progreso aun no lo he podido mirar, pero ya le hechare un ojo.

salDer
02-02-2007, 01:17:57
Hola


Haberlo dicho antes!! Revisa este (http://www.clubdelphi.com/foros/showthread.php?t=4761) hilo para la barra de progreso.

Y si quieres usar un cuadro de dialogo usa de la pestaña dialogs (de componentes) el componente SaveDialog y coges la propiedad SaveDialog1.FileName como parametro de destino para el fichero.

Espero te sirva.

Saludos

Hola, bueno primero darte las gracias por molestare, pero aun tengo un problema, esto es el codigo de mi procedimiento:
SaveDialogCopiaSeguridad.Execute;
copyfile('gpsM10-A.gdb', SaveDialogCopiaSeguridad.FileName , False);

y ahora me da un fallo de imcompatibilidad de tipos, especificando:
[Pascal Error] UnitPrincipal.pas(90): E2010 Incompatible types: 'TFileName' and 'PAnsiChar', supongo que sera una tonteria, te agradeceria que me lo solucionases, gracias.
Lo de la barra de progreso aun no lo he podido mirar, pero ya le hechare un ojo.

Bicho
02-02-2007, 11:09:48
Hola, prueba con lo que te he puesto en rojo.
Simplemente es hacer un TypeCast


copyfile('gpsM10-A.gdb', PChar(SaveDialogCopiaSeguridad.FileName) , False);


Saludos

salDer
02-02-2007, 14:36:33
eyyyyyy ya tengo casi terminada mi aplicacion, ya tengo hecha la barra de progreso, lo unico que falla ahora es que el copyfile solo copia archivos que esten en el mismo directorio del programa, sera por el comando:
copyfile('gpsM10-A.gdb', PChar(SaveDialogHacerCopia.FileName) , False);
en el SaveDialog tienes que seleccionar un archivo que este en la misma carpeta que donde esta el gpsM10-A.gdb sino no hace nada, pero bueno algo es algo :D.

Bicho
02-02-2007, 14:43:16
lo unico que falla ahora es que el copyfile solo copia archivos que esten en el mismo directorio del programa, sera por el comando:
copyfile('gpsM10-A.gdb', PChar(SaveDialogHacerCopia.FileName) , False);
en el SaveDialog tienes que seleccionar un archivo que este en la misma carpeta que donde esta el gpsM10-A.gdb sino no hace nada, pero bueno algo es algo .

Hola, no deberías tener ningún problema con esto.
Los dos parámetros: origen y destino, deben contener la ruta completa de sus correspondientes ficheros:

Con el SaveDialog.Filename tienes la ruta completa de destino.
Con el origen, debes indicarle la ruta completa: C:\MiCarpeta\MiBD.gdb

Saludos

Pedro-Juan
03-02-2007, 13:27:12
No necesito cerrar nada, me funciona bien lo siguiente en tiempo de ejecución. Delphi 5, Interbase.


//Form para la copia
procedure TF_Backup.sBtnCopiarBackupClick(Sender: TObject);//Button copiar
var cFileName,cOrigen,cDestino: String;
begin
F_Backup.sLabel3.Visible := False; //Label de información de copia hecha
cFileName := 'ARCHIVO.GDB'; //Siempre el mismo, no puede cambiar
cOrigen := Trim(F_Backup.sFilenameEditCopy.Text); //Componente externo a delphi
cDestino := Trim(F_Backup.sDirectoryEditCopy.Text); //Componente externo a delphi
if cDestino <> '' then if not DirectoryExists(cDestino) then MkDir(cDestino);
cDestino := (cDestino + '\' + cFileName);//En esta posición por si no
//existía el directorio
if CopyFile(PChar(cOrigen), PChar(cDestino), False) then begin
F_Backup.sLabel3.Caption := 'La copia se realizó correctamente'
+ #13
+ cDestino
+ ' '
+ DateToStr(Now)
+ ' '
+ TimeToStr(Time);
F_Backup.sLabel3.Visible := True;
end
else begin
F_Backup.sLabel3.Visible := False;
ShowMessage('No se pudo realizar la copia');
end;
end;

waly2k1
08-02-2007, 19:07:33
Si me decis como?. Te puedo pasar un ejemplo de como zipear la base a respaldar y como restaurar dicha base, todo en un solo form, funciona en Delphi 7, pero me imagino en otras versiones también. Salu2