Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Importar Base datos mysql (https://www.clubdelphi.com/foros/showthread.php?t=80344)

jcrios_9 19-09-2012 21:58:03

Importar Base datos mysql
 
Buenas, tengo una duda sobre el proyecto que estoy realizando. Tengo que realizar una copia de seguridad y restaurar la base de datos mysql con Builder c++ 6. El caso es que haer la copia de seguridad me funciona perfecto gracias a un codigo de un compañero del foro, pero no consigo restaurarla. El codigo para la copia de seguridad es el siguiente:

Código Delphi [-]
char *user="root";
        char *password="root";
        AnsiString nombrefichero=Edit1->Text; //el nombre que introduzca el usuario
        char *database="basedatos";
        AnsiString outputdir="C:\\";
    time_t t = time(NULL);
    struct tm *tmp = localtime(&t);
    char fecha[9];
    strftime(fecha, sizeof(fecha), "%d%m%Y", tmp);

    char outputfile[MAX_PATH];
    char args[MAX_PATH];

    /* Calculamos el nombre del archivo de salida */
    sprintf(outputfile, "%s\\%s_%s.sql",outputdir, nombrefichero, fecha);
        ShowMessage(outputfile);
    /* Calculamos los parámetros */
    sprintf(args, "-u%s -p%s %s -r %s", user, password, database, outputfile);

    /* Hacemos el respaldo */
    ShellExecute(
        0,
        "open",
        "C:\\Program Files (x86)\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe",
        args,
        "",
        SW_HIDE);
           }
¿Alguien me podria indicar como restaurar la copia de seguridad, sabiendo que el codigo puesto anteriormente para hacer la copia de seguridad funciona perfectamente?

Gracias y un saludo!

Casimiro Notevi 19-09-2012 22:01:37

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

jcrios_9 19-09-2012 22:07:25

De acuerdo, gracias por avisar. Un saludo

Casimiro Notevi 19-09-2012 23:23:46

Pero si dices que el backup lo haces bien y lo que no consigues que funcione es la restauración, entonces ¿por qué pones el código que hace el backup?, ¿no crees que sería más conveniente que pongas el que hace la restauración? ;)
Pon el código, explica algo de lo que haces, cuéntanos qué problemas tienes, ¿algún mensaje de error?, etc.

jcrios_9 20-09-2012 12:12:02

Hola, explicaré un poco mis dudas aver si alguien puede darme alguna pista.

El programa comienza dandole valores a los parametros para hacer la llamada a mysqldump. En principio para restaurar sería exatamente lo mismo.

Código Delphi [-]
   
char *user="root";
char *password="root";
AnsiString nombrefichero=Edit1->Text; //el nombre que introduzca el usuario     
char *database="basedatos";     
AnsiString outputdir="C:\\";     
time_t t = time(NULL);     
struct tm *tmp = localtime(&t);     
char fecha[9];     
strftime(fecha, sizeof(fecha), "%d%m%Y", tmp);      
char outputfile[MAX_PATH];     

char args[MAX_PATH];      /* Calculamos el nombre del archivo de salida */     

sprintf(outputfile, "%s\\%s_%s.sql",outputdir, nombrefichero, fecha);

Lo que si cambiaría serian el calculo de parametros y la llamada a ShellExecute. En este caso utilizo mysqldump.exe porque es para respaldar la base de datos.
Pues bien, para restaurar la base datos, en vez de mysqldump se usa mysql simplemente.
Lo que no entiendo de los parametros para respaldar la base de datos es el -r que resalto. Así si hace bien el respaldo.
Sin embargo, no sé que poner para poder hacer la restauracion de la base de datos. He probado muchas formas y el resultado es que es como si no hiciera nada.

Código Delphi [-]
       
 /* Calculamos los parámetros */    
 sprintf(args, "-u%s -p%s %s -r %s", user, password, database, outputfile);    

 /* Hacemos el respaldo */     
     ShellExecute(         0,        
     "open", 
     "C:\\Program Files (x86)\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe",       
      args,         
       "",        
      SW_HIDE);           
        }

La sintaxis en mysql para hacer el respaldo es esta:
Código SQL [-]
mysqldump -u root -p nombre_base_de_datos > fichero.sql

Y para restaurar la base de datos es esta:
Código SQL [-]
mysql -u root -p  nombre_base_de_datos < fichero.sql

Si le ejecuto por ventana de comandos, si sale bien, el caso es incluirlas en Builder c++ con ShellExecute. Pero la que me falta por incluir es la de restaurar.

Espero que me entendais un poco mejor. Gracias y un saludo a todos.

jcrios_9 20-09-2012 17:25:25

He metido un pause y me dice que no encunetra la ruta de mysqldump porque la esta leyendo desde la ruta del proyecto y no desde la ruta del .bat.

Es raro porque al .bat solo no hay que darl ruta porque esta en la misma...

Casimiro Notevi 20-09-2012 17:27:43

¿Has seguido el código paso a paso para ver los valores antes de ejecutar el comando?

roman 20-09-2012 17:34:05

Cita:

Empezado por jcrios_9 (Mensaje 443715)
Lo que no entiendo de los parametros para respaldar la base de datos es el -r que resalto.

Y, ¿qué es lo que no entiendes? Basta poner

Código:

> mysqldump --help
en la línea de comandos para obtener una lista de todos los parámetros y su uso. -r es el parámetro que te permite indicar el archivo con las instrucciones SQL. Esto es necesario al ejecutarlo desde delphi, porque la otra manera, desviando la salida a un archivo:

Código:

mysqldump bd > respaldo.sql
no la puedes usar con ShellExecute. Se puede hacer con delphi, pero es más complicado pues necesitar usar tuberías.

El caso inverso, el restaurar una base, resulta similar. No puedes usar la opción

Código:

mysql bd < respaldo.sql
directamente con ShellExecute.

mysql no tiene (creo) una opción tan directa como mysqldump para indicar el archivo de entrada, pero tiene la opción -e para ejecutar comandos, incluidos los comandos internos de mysql, como lo es source.

En resumen, puedes hacerlo así:

Código:

> mysql -e "source \ruta\al\respaldo.sql" bd
lo cual sí puedes ejecutar con ShellExecute.

// Saludos

jcrios_9 20-09-2012 18:09:39

Muchas gracias roman. Lo habia conseguido a través de ejecutar un .bat, pero la verdad es que de esta manera es más sencillo. Me funciona tal y como lo has puesto.

De nuevo gracias y saludos!

DanielMC 21-09-2012 16:50:18

Saludos a todos
Estuve probando el codigo para hacer el backup y funciona perfectamente en c++ Builder 6 pero en c++ Builder xe me da los siguientes errores:
Código:

Cannot convert 'char const[5]' to 'const wchar_t *'

E2342 Type mismatch in parameter 'lpOperation' (wanted 'const wchar_t *', got 'const char *')

El error me lo da especificamente en la linea del ShellExecute
Probe de direntes formas, una de ellas:
Código:

ShellExecute(Handle, (LPCTSTR)"open", (LPCTSTR)"C:\\Program Files (x86)\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe/", 0, 0, SW_SHOWNORMAL);
y no da error, apenas le cambio y pongo:
Código:

ShellExecute(Handle, (LPCTSTR)"open", (LPCTSTR)"C:\\Program Files (x86)\\MySQL\\MySQL Server 5.5\\bin\\mysqldump.exe/", args, 0, SW_SHOWNORMAL);
Me da el error de arriba utilizando el args.
Alguien podria indicarme la manera correcta de hacerlo en c++ builder xe


La franja horaria es GMT +2. Ahora son las 07:49:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi