Ver Mensaje Individual
  #7  
Antiguo 20-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Reputación: 19
ariefez Va por buen camino
Si la base de datos tienen alguna forma de comunicarse (Estan en la misma red o via Internet) solo se tendrias q copiar los registros de una a otra base de forma directa. Osea conectandote a una, leer el registro en cuestion y hacer un insert con los valores q son necesarios en la otra BD.

si no hay comunicacion posible entre ambas BD siempre hay otra salida, usar archivos (almacenar el registro en un archivo e insertar el contenido en la otra base).

este es el codigo q usaba en esa situacion, faltan pulir algunas cosas, pero almenos no daba problemas


Para generar el registro de insercion

Código Delphi [-]
var
  Tabla, Fields, ValueScript, Condicion: string;
  SelectSQL: string;
  PK: Integer;
  I: Integer;

  MSFields: TMemoryStream;
  BufferSize: Int64;
  InsertSQL : string[255]; // Sentencia Insert limitada
  FieldCount: Integer; // Numero de campos
  FieldValue: string[255]; // -> Falta mejorar, Esta limitado (Deberia ser Variant)
  FieldBlob: TMemoryStream;
begin
  Fields := 'CAR_ID, CAR_NOM, CAR_RDE'; // Campos a guardar
  Tabla := 'CARGOS'; // Nombre de la tabla
  Condicion := 'CAR_ID = :PK'; //Condicion para seleccionar un registro
  PK := 7; // Valor del parametro de "Condicion"
  ValueScript := ':CAR_ID, :CAR_NOM, :CAR_RDE'; // parametros de la sentencia Insert

  fptrDB.Active := True; // activo la transaccion
  MSFields := TMemoryStream.Create; // Contenedor de los valores de los campos
  try

    { Sentencia SQL de insercion - Falta mejorar (Tiene un limite de 255 caracteres)}
    InsertSQL := 'INSERT INTO ' + Tabla + ' (' + Fields + ')'
      + '  VALUES (' + ValueScript + ')';
    //Tamaño
    BufferSize := Length(InsertSQL) + 1;
    MSFields.Write(BufferSize, SizeOf(Int64));
    //Valor
    MSFields.Write(InsertSQL, BufferSize);

    {Sentencia SQL}
    SelectSQL := 'SELECT ' + Fields + ' FROM ' + Tabla + ' WHERE ' + Condicion;
    { Obtengo los campos de la tabla }
    fpdsTabla.SelectSQL.Clear;
    fpdsTabla.SelectSQL.Add(SelectSQL);
    fpdsTabla.ParamByName('PK').Value := PK; // Varia segun el contenido de "Condicion"
    fpdsTabla.Open;

    { Numero de registros }
    FieldCount := fpdsTabla.FieldCount;
    MSFields.Write(FieldCount, SizeOf(Integer));

    { Valores de los campos }
    for I := 0 to fpdsTabla.FieldCount - 1 do
      if fpdsTabla.Fields[i].IsNull then
      begin
        {Tamaño}
        BufferSize := 0;
        MSFields.Write(BufferSize, SizeOf(Int64));
      end else
        if fpdsTabla.Fields[i].IsBlob then
        begin
          FieldBlob := BlobToStream(fpdsTabla.Fields[i]);
          BufferSize := IfThen(Assigned(FieldBlob), FieldBlob.Size);
          if Assigned(FieldBlob) then
          begin
            {Tamaño}
            MSFields.Write(BufferSize, SizeOf(Int64));
            {Valor}
            if 0 < BufferSize then
              FieldBlob.SaveToStream(MSFields);
            FieldBlob.Free;
          end else
            MSFields.Write(BufferSize, SizeOf(Int64));
        end else
        begin
          FieldValue := fpdsTabla.Fields[i].AsString;
          {Tamaño}
          BufferSize := Length(FieldValue) + 1;
          MSFields.Write(BufferSize, SizeOf(Int64));
          {Valor}
          MSFields.Write(FieldValue, BufferSize);
        end;

    fpdsTabla.Close;
    { Guardo el registro }
    MSFields.SaveToFile(ExtractFilePath(Application.ExeName) + 'Registro.msr');
  finally
    fptrDB.Active := False;
    MSFields.Free;
  end;
end;

para leer el registro e ingresarlo en otra BD

Código Delphi [-]
var
  MSFields: TMemoryStream;
  BufferSize: Int64;
  InsertSQL : string[255];
  FieldCount: Integer; // Numero de campos
  FieldValue: string[255];
  FieldBlob: TMemoryStream;
  InpBuf: Pointer;
  I: Integer;
begin
  fptrDB.StartTransaction;
  MSFields := TMemoryStream.Create;
  try
    { Obtengo el registro }
    MSFields.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Registro.msr');
    { Sentencia SQL de insercion }
    MSFields.Read(BufferSize, SizeOf(Int64));
    MSFields.Read(InsertSQL, BufferSize);
    { Numero de registros }
    MSFields.Read(FieldCount, SizeOf(Integer));
    { Valores de los campos }
    fpqyTabla.SQL.Clear;
    fpqyTabla.SQL.Add(InsertSQL);
    fpqyTabla.Prepare; // Preparo la consulta (reconocimiento de tipos...)
    for I := 0 to FieldCount - 1 do
    begin
      fpqyTabla.Params[i].Clear;
      if fpqyTabla.Params[i].IsBlob then
      begin
        InpBuf := nil;
        FieldBlob := TMemoryStream.Create;
        try
          {Tamaño}
          MSFields.Read(BufferSize, SizeOf(Int64));
          if 0 < BufferSize then
          begin
            GetMem(InpBuf, BufferSize);
            {Valor}
            MSFields.Read(InpBuf^, BufferSize);
            FieldBlob.Write(InpBuf^, BufferSize);
            fpqyTabla.Params[i].LoadFromStream(FieldBlob);
          end;
        finally
          FieldBlob.Free;
          if Assigned(InpBuf) then
            FreeMem(InpBuf);
        end;
      end else
      begin
        {Tamaño}
        MSFields.Read(BufferSize, SizeOf(Int64));
        if 0 < BufferSize then
        begin
          MSFields.Read(FieldValue, BufferSize);
          fpqyTabla.Params[i].Value := FieldValue;
        end;
      end;
    end;
    fpqyTabla.ExecQuery;
  finally
    fptrDB.Commit;
    MSFields.Free;
  end;
end;

e usado los componentes FibPLus pero no creo q haya problemas con otros ya que uso propiedades generales.

Última edición por ariefez fecha: 20-07-2007 a las 22:06:23.
Responder Con Cita