Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-07-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Si es un blod tipo texto simplemente ejecutalo como si furar un acadena(char o varchar) pero si son archivos bianrios y vas almacenar alchivos binarios la cosa cambia pero si vas almacenar texto es igual que lo anterior.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #2  
Antiguo 20-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 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
  #3  
Antiguo 20-07-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
Poder: 19
ariefez Va por buen camino
Me olvide de algo: la funcion BlobToStream

Código Delphi [-]
function BlobToStream(Field: TField): TMemoryStream;
begin
  Result := nil;
  if Field.IsBlob then
  begin
    Result := TMemoryStream.Create;
    try
      TFIBBlobField(Field).SaveToStream(Result);
    except
      FreeAndNil(Result);
    end;
  end;
end;

TFIBBlobField pertenece a FibPlus debe cambiarlo al tipo q usa interbase o prueba con el tipo TBlobField
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
¿Como Guardar un Bmp/Jpg en un campo BLOB desde Delphi? LuCkY_007 MySQL 4 18-01-2007 12:05:26
Como ejecutar un Scrip .sql desde Delphi? ingel SQL 4 08-12-2006 20:36:27
¿cargar un campo blob por codigo? fredo SQL 2 18-05-2005 14:56:59
Como crear alias desde codigo acl_gandalf Tablas planas 2 01-02-2005 19:44:49
Como crear un campo en una tabla a traves de código URBANO Conexión con bases de datos 1 16-03-2004 10:39:06


La franja horaria es GMT +2. Ahora son las 01:03:54.


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