Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Consultar tablas de dos bases de datos

Tengo dos bases de datos en Firebird y necesito conectar ambas para poder importar los datos de una a otra. Estoy usando C++ Builder con los elementos de conexión de interbase, pero no sé si se puede hacer algo así o tendré que exportar los datos.
Responder Con Cita
  #2  
Antiguo 14-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Usa 2 IBDatabase, 2 IBTransaction, 2 IBquery, cada uno a una BD.
Select en una e insert en la otra.
Responder Con Cita
  #3  
Antiguo 14-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Sí, eso lo tengo claro, pero lo que no veo es como hacerlo. ¿Leo los datos de una con una select y los asigno a variables o puedo hacer directamente un cosa así?
Código SQL [-]
INSER INTO 'BD1:Tabla1' SELECT * FROM 'BD2:Tabla2'
Responder Con Cita
  #4  
Antiguo 14-10-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entre BDs distintas no puedes hacerlo así, tendrías que hacerlo mediante un 'stored procedure' o 'trigger'.
Lo que puedes hacer es un bucle, algo más o menos así:

Código Delphi [-]
select * from bd1.tabla
while not bd1.tabla.eof do
begin
  insert into bd2.tabla values (bd1.tabla.campo1,bd1.tabla.campo2,...)
  bd2.post
  bd1.tabla.next
end
Responder Con Cita
  #5  
Antiguo 14-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Muchas gracias. Probaré y ya os diré como ha ido.
Responder Con Cita
  #6  
Antiguo 16-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
No sé que hago mal. Estoy usando este código:
Código:
for (nItem = 0; nItem < slImporta->Count; nItem ++)
{
     cAux = "";

     if (!tColegio->InTransaction)
          tColegio->StartTransaction();

     Query->Close();
     qTemp->Close();
     qImporta->Close();
     qImporta->SQL->Text = "SELECT ";

     switch (StrToInt(slImporta->Strings[nItem]))
     {
          default:
               qTemp->SQL->Text = "SELECT RDB$FIELD_NAME FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = :Tabla";
               qTemp->ParamByName("Tabla")->AsString = UpperCase(cTablas[nItem]);
               qTemp->Open();

               for (; !qTemp->Eof; qTemp->Next())
               {
                    qImporta->SQL->Text = qImporta->SQL->Text + qTemp->FieldByName("RDB$FIELD_NAME")->AsString.Trim() + ", ";
                    cAux = cAux + qTemp->FieldByName("RDB$FIELD_NAME")->AsString.Trim() + ", ";
               }

               qImporta->SQL->Text = StringReplace(qImporta->SQL->Text.SubString(1, qImporta->SQL->Text.LastDelimiter(",") - 1).Trim(), "\r\n", "", oReplace) + " FROM " + cTablas[nItem];
               cAux = cAux.SubString(1, cAux.LastDelimiter(",") - 1).Trim();

               Query->SQL->Text = "INSERT INTO " + cTablas[nItem] + " (" + cAux + ") VALUES (:" + StringReplace(cAux, ", ", ", :", oReplace) + ")";
               break;
          case 2:
               qImporta->SQL->Text = "SELECT DISTINCT Registro, Padre FROM Alumnos";
               Query->SQL->Text    = "INSERT INTO AluPad (Alumno, Padre) VALUES (:Alumno, :Padre)";
               break;
          case 3:
               qImporta->SQL->Text = "SELECT Entidad, Nombre FROM Bancos";
               Query->SQL->Text    = "INSERT ITNO Bancos (Entidad, Nombre) VALUES (:Entidad, :Nombre)";
               break;
          case 7:
               qImporta->SQL->Text = "SELECT A.Padre, B.Cuenta, B.Defecto FROM Alumnos A, Cuentas B WHERE A.Referencia||A.Recibo = B.Referencia ORDER BY Padre";
               Query->SQL->Text    = "INSERT INTO Cuentas (Padre, Cuenta, Defecto) VALUES (:Padre, :Cuenta, :Defecto)";
               break;
          case 14:
               qImporta->SQL->Text = "SELECT DISTINCT A.Padre_Ape, A.Padre_Nom, A.Registro, A.Padre_Sex, A.Padre_Dni, A.Domicilio, A.Cpostal, A.Poblacion, A.Provincia, A.Telefono, A.Correo, B.Domicilia, A.Padre_Obs FROM Padres A, Alumnos B WHERE A.Registro = B.Padre ORDER BY Padre_Ape, Padre_Nom, Registro";
               Query->SQL->Text    = "INSERT INTO Padres (Padre_Ape, Padre_Nom, Registro, Padre_Sex, Padre_Dni, Domicilio, Cpostal, Poblacion, Provincia, Telefono1, Correo, Domicilia, Padre_Obs) VALUES (:Padre_Ape, :Padre_Nom, :Registro, :Padre_Sex, :Padre_Dni, :Domicilio, :Cpostal, :Poblacion, :Provincia, :Telefono1, :Correo, :Domicilia, :Padre_Obs)";
               break;
     }

     qImporta->Open();
     for (; !qImporta->Eof; qImporta->Next())
     {
          if (!tColegio->InTransaction)
               tColegio->StartTransaction();

          Query->Close();
          for (int nParam = 0; nParam < Query->ParamCount; nParam ++)
               Query->Params->Items[nParam]->Value = qImporta->Fields->Fields[nParam]->Value;

          try
          {
               Query->ExecSQL();
               tColegio->Commit();
          }
          catch(...)
          {
               tColegio->Rollback();
          }
     }
}
Vamos por partes:
  1. cAux es una variable AnsiString.
  2. cTablas es un vector AnsiString donde guardo los nombres de las tablas a importar.
  3. Query y qTemp son dos TIBQuery que apuntan a una de las dos bases de datos.
  4. qImporta es un TIBQuery que apunta a la otra base de datos.
Cuando ejecuto este código se montan bien los querys y no hay ningún error, hasta que sale del switch. Cuando pasa por el break me da este mesaje de error:
Cita:
class EIBInterBaseError with message 'invalid transaction handle (expecting explicit transaction start)'
¿Qué estoy haciendo mal?

Última edición por Casimiro Notevi fecha: 16-10-2013 a las 14:00:14.
Responder Con Cita
  #7  
Antiguo 16-10-2013
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
No he dicho nada. Estaba definiendo mal una transacción. Disculpad.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consultar Varias Bases de Datos amerika111 Firebird e Interbase 4 03-05-2011 22:20:42
Consultar 2 bases de datos Michael SQL 2 05-03-2009 23:58:03
JOIN de dos tablas en dos bases de datos diferentes gluglu Firebird e Interbase 3 12-02-2005 12:39:48
consulta a tablas de bases de datos externas odin SQL 4 23-09-2004 17:07:27
Usar tablas de dos bases de datos distintas davidcm SQL 2 26-06-2003 17:05:05


La franja horaria es GMT +2. Ahora son las 11:30:56.


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
Copyright 1996-2007 Club Delphi