Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Copiar datos entre Bases de Datos (https://www.clubdelphi.com/foros/showthread.php?t=80166)

martini002 07-09-2012 02:47:03

Copiar datos entre Bases de Datos
 
Saludos Amigos, donde quiera que se encuentren,
tengo un problemita con una situacion, quiza a ustedes les ha pasado anteriormente,
quisiera copiar los datos de una BD a otra, pero en el ultimo paso me quedo trancado,
y no tengo idea de que pudiera hacer, he estado buscando pero no encuentro algo que me ayude,
les muestro lo que he hecho,

Gracias Infinitas por su tiempo y su ayuda

Código Delphi [-]

//Creamos la nueva base de datos desde cero y luego agregamos un par de datos.

procedure TForm7.Button1Click(Sender: TObject);
Var
  User, Pass:String;
begin
  with ZConnection1 do
    try
      if ZConnection1.Connect=True then
        begin
          Disconnect;
        end;
      DataBase:='F:\Hola.sqlite';
      Protocol:='sqlite';
      Properties.Add('CreateNewDatabase= CREATE DATABASE '+QuotedStr('F:\Hola.sqlite')+''); 
      Properties.Add(' User '+QuotedStr(User)+' PASSWORD '+QuotedStr(Pass)+' PAGE_SIZE 4096 DEFAULT CHARACTER SET ISO8859_1');
    finally
      Connect;
    end;
  With ZQuery1 Do
    try
      Close;
      SQL.Text:='CREATE TABLE Prueba (Codigo Integer, Nombre Char(20))';
    finally
      Open;
    end;
end;

procedure TForm7.Button2Click(Sender: TObject);
begin
  With ZQuery1 Do
    try
      Close;
      SQL.Text:='Insert Into Hola Values(1, '+QuotedStr('Martin')+')';
    finally
      ExecSQL
    end;
end;

Código Delphi [-]
//Luego creamos la segunda base de datos, y aqui es donde viene la cuestion
//al final quiero pasar los datos de la tabla de arriba para esta, cuando presione el boton 4
//Alguna idea?

procedure TForm7.Button3Click(Sender: TObject);
Var
  User, Pass:String;
begin
  with ZConnection1 do
    try
      if ZConnection1.Connect=True then
        begin
          Disconnect;
        end;
      DataBase:='F:\Mundo.sqlite';
      Protocol:='sqlite';
      Properties.Add('CreateNewDatabase= CREATE DATABASE '+QuotedStr('F:\Mundo.sqlite')+''); 

      Properties.Add(' User '+QuotedStr(User)+' PASSWORD '+QuotedStr(Pass)+' PAGE_SIZE 4096 DEFAULT CHARACTER SET ISO8859_1');
    finally
      Connect;
    end;
  With ZQuery1 Do
    try
      Close;
      SQL.Text:='CREATE TABLE Mundo (Codigo Integer, Nombre Char(20))';
    finally
      Open;
    end;
end;

procedure TForm7.Button4Click(Sender: TObject);
begin
  if ZConnection1.Connect=True then
    begin
      ZConnection1.Disconnect;
    end;
  ZConnection1.DataBase:='F:\Hola.sqlite';
  ZConnection1.Protocol:='sqlite';
  ZConnection1.Connect:=True;
  ZQuery1.Close;
  ZQuery1.SQL.Text:='Select * From Hola';
  ZQuery1.Open;
end;

Caral 07-09-2012 02:55:01

Hola
Nunca lo he hecho pero me parece que tienes que:
1- tener dos conexiones diferentes para cada BD.
2-Mantener las conexiones activas
3-Que las tablas y campos sean iguales
4-Hacer un recorrido de la tabla que quieras copiar.
5-Hacer un update a la tabla nueva haciendo un recorrido del query de la primera tabla.
no me hagas mucho caso, solo opino.
saludos

martini002 07-09-2012 03:01:19

Hola Caral,
eso lo he pensado,
pero ahora la cuestion es como?
ok podria usar dos conexiones, pero como leo de un Query a otro?
Gracias

Caral 07-09-2012 03:11:51

Hola
Me imagino que igual que si usaras una sola conexión, no creo que sea diferente.
No lo he hecho nunca amigo, solo me imagino.
Saludos

Casimiro Notevi 07-09-2012 09:44:17

No sé si sqlite lo permite, algunas bases de datos sí, el trabajar con ambas a la vez, algo así como:
Código SQL [-]
insert into base2.tablaA (select * from base1.tablaA)

La forma clásica es lo que ha explicado Caral, tener 2 conexiones: (resumiendo mucho):

Código Delphi [-]
base1.open;
while not base1.eof do
begin
  insert into base2 values (base1.campo1, base1.campo2, base1.campo3);
  base2.post;
  base1.next;
end;

roman 07-09-2012 19:52:50

Cita:

Empezado por Casimiro Notevi (Mensaje 442249)
No sé si sqlite lo permite, algunas bases de datos sí, el trabajar con ambas a la vez, algo así como:
Código SQL [-]
insert into base2.tablaA (select * from base1.tablaA)

Sí lo permite, pero primero hay que "importar" la segunda base:

Código SQL [-]
attach database "\ruta\a\la\base2.db" as base2

// Saludos

martini002 08-09-2012 11:37:49

Hoy me fui LEJOS donde no existiera la energia electrica, (Amazonia Venezolana)
y apuesto que muchos de nosotros quisiera irse, pero tan solo por un momento ;)
porque seria una pena evitar recibir un halago como este que recibi cuando llegue:
"Martin, le vas a quitar el trabajo a los Administradores", aunque se que no sera verdad,
y menos yo; No porque menos-precie mi ezfuerzo o el de ustedes amigos mios,
sino que por tan solo; por AHORA no pasara, y solo nosotros sabemos porque,
y por tanto no respondi a este mensaje aunque hallan llegado muchas notificaciones,

me gustaria opinar sin aun probarlo, (aunque lo probare a primera hora)
Roman! Tienes toda la razon, me faltaba conocer esa sentencia,
donde importaras a memoria (Supongo yo!) toda la tabla,
y luego la manejaras a tu antojo, pues es lo que mas logica y sentido comun
puede tener, aunque no menos que las otras opiniones, pero si creo yo,
que absurdo seria no tener este problema en cuenta,
Importar una BD a Otra? despues de tantos años de investigacion sobre el asunto?
no creo que vallamos nosotros a inventar como hacerla, no se si me siguen,
pero bueno, no queria dejar este momento para escribirles.

A primera hora estare haciendo las pruebas correspondientes!
como buen curioso e informatico caprichoso :)

Gracias Roman y a todos

ElMug 08-09-2012 21:40:01

En SQLite3 es facil.

Attach, como explico Roman, y usa el DUMP de la BD-1 a un archivo DumpX. Luego todo el archivo DumpX (que son comandos SQL en texto comun) lo aplicas a la BD-2. Esto te crea la tabla y seguidamente le carga los datos.

En estos Dumps puedes inclusive pasar TODA una base de datos a otra.

Sin embargo, con SQLite3, puede siempre usarse una base de datos que este "attached" como si ya fuera solo una. Ese principio aumenta la capacidad de multiaccesos para escribir: procesos escribiendo en BD-1 no bloquean BD-2, pues son archivos fisicamente independientes.

martini002 10-09-2012 23:24:06

Saludos,

Estuve haciendo unas pruebas, pero no se me ocurre mas nada,
y aun no he podido encontrar algun ejemplo de alguien que lo halla hecho antes
miren lo que he estado haciendo, al parecer importa la BD correctamente,
porque no me da ningun error, y de paso estoy viendo cual es la base de datos conectada
actualmente, lo que me muestra que SI esta conectada la numero 1 (Hola)
pero cuando entra al proceso de copiar los datos entonces da un error,
ya las dos estan creadas, lo hice con una misma conexion,
aun no he intentado con dos, pero creo que no hace falta,
por lo menos no hasta este paso, pues las crea correctamente
que creen que pueda estar fallando aqui?

Gracias

Código Delphi [-]
procedure TForm7.Button4Click(Sender: TObject);
var
a:string;
begin
  ZQuery1.Close;
  ZQuery1.SQL.Text:='Attach Database "F:\Mundo.sqlite" as Mundo';
  ZQuery1.Open;
  ZQuery1.Close;
  A:=ZConnection1.Database;
  ShowMessage(a);//Esto muestra: F:\Hola.sqlite
  ZQuery1.SQL.Text:='Insert Into Mundo.Prueba (Select * From Hola.Prueba)';//Aqui da el error de Missing Database o una sentencia incorrecta.
  ZQuery1.Open;
end;

Casimiro Notevi 11-09-2012 00:12:57

Cita:

Empezado por martini002 (Mensaje 442701)
pero cuando entra al proceso de copiar los datos entonces da un error,

Hombre, si quieres que alguien que sepa del tema te ayuda... no hagas que tenga que adivinar el error ;)

roman 11-09-2012 01:26:34

Y, ¿ZQuery está conectado a ZConnection?

// Saludos

martini002 11-09-2012 01:53:41

Casimiro eso lo se, el error esta expresado en el codigo

Código Delphi [-]
ZQuery1.SQL.Text:='Insert Into Mundo.Prueba (Select * From Hola.Prueba)';//Aqui da el error de Missing Database o una sentencia incorrecta.

Si Roman, esta conectado el ZQuery1 al ZConnection1
Gracias

Casimiro Notevi 11-09-2012 02:29:21

Cita:

Empezado por martini002 (Mensaje 442723)
Casimiro eso lo se, el error esta expresado en el codigo

:eek: Con mi configuración de colores no veía esa parte, salía del mismo color que el fondo.
Lo he visto al "citar", que sale en letra negra.

ElMug 11-09-2012 02:57:37

No creo que en ese query puedas ejecutar comandos que no sean de "traer" datos. Necesitas algo que relacione "update", o "execute". Tal vez hasta un componente mas para lograrlo.

roman 11-09-2012 03:06:35

Cita:

Empezado por Casimiro Notevi (Mensaje 442729)
:eek: Con mi configuración de colores no veía esa parte, salía del mismo color que el fondo.
Lo he visto al "citar", que sale en letra negra.

¿Te das cuenta de que te has perdido todos los comentarios de código? :rolleyes:

// Saludos

Casimiro Notevi 11-09-2012 03:38:44

Cita:

Empezado por roman (Mensaje 442740)
¿Te das cuenta de que te has perdido todos los comentarios de código? :rolleyes:

Bueno, creo que poco tiempo, hace unos días estuve instalando unos "temas" y dejándolo a mi gusto (después de la instalación del sistema en un disco nuevo), por lo que han sido sólo 2 ó 3 días :)

roman 11-09-2012 03:55:10

Cita:

Empezado por martini002 (Mensaje 442701)
Código Delphi [-]
procedure TForm7.Button4Click(Sender: TObject);
var
a:string;
begin
  ZQuery1.Close;
  ZQuery1.SQL.Text:='Attach Database "F:\Mundo.sqlite" as Mundo';
  ZQuery1.Open;
  ZQuery1.Close;
  A:=ZConnection1.Database;
  ShowMessage(a);//Esto muestra: F:\Hola.sqlite
  ZQuery1.SQL.Text:='Insert Into Mundo.Prueba (Select * From Hola.Prueba)';//Aqui da el error de Missing Database o una sentencia incorrecta.
  ZQuery1.Open;
end;

Yo puedo hacer esto sin problemas:

Código Delphi [-]
ZQuery1.SQL.Text := 'attach database "\ruta\a\la\base2.db" as base2';
ZQuery1.ExecSQL;

ZQuery1.SQL.Text := 'insert into base2.tablaA (select * from base1.tablaA)';
ZQuery1.ExecSQL;

Pero claro, si pongo Open en lugar de ExecSQL, obtengo errores ;)

// Saludos

ElMug 11-09-2012 07:06:06

Si. Gracias Roman.

A esto me referia, mas sin detalles, por no ser usuario de los Zeos.

martini002 11-09-2012 19:12:25

Asi es Roman, siempre se me pasa ese ExecSQL;
pero fijate lo puse asi y me da un error de sintaxis cerca del Select

Código Delphi [-]
ZQuery1.SQL.Text := 'attach database "\ruta\a\la\base2.db" as base2';
ZQuery1.ExecSQL;

ZQuery1.SQL.Text := 'insert into base2.tablaA (select * from base1.tablaA)';
ZQuery1.ExecSQL;

Cita:

'SQL Error: near "Select": syntax error'

roman 11-09-2012 19:18:54

Sí, pegué algo que no es correcto. Pon así la seguda sentencia:

Código Delphi [-]
ZQuery1.SQL.Text := 'insert into base2.tablaA select * from tablaA';

// Saludos


La franja horaria es GMT +2. Ahora son las 02:59:14.

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