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 Temas de Hoy

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 online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
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 online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
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



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 10:14:37.


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