TStream e Blob ?

Delphi

26/04/2006

Eu gostaria de copiar uma imagem de uma tabela para outra, o campo é do tipo Blob do FireBird, montei esse código mais não tive sucesso, alguém poderia me dar uma ajudinha ?


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  A,B : TStream;
Begin

  ClientDataSet1.Open;
  ClientDataSet2.Open;
  ClientDataSet1.First;
  ProgressBar1.Position := 0;
  ProgressBar1.Max := ClientDataSet1.RecordCount;

  While not ClientDataSet1.Eof do begin
    ClientDataSet2.Append;
    ClientDataSet2ID.AsInteger         := ClientDataSet1ID.AsInteger;
    ClientDataSet2DESCRICAO.AsString   := ClientDataSet1DESCRICAO.AsString;

    A := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´FOTO´), BMREAD);
    B := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´COMENTARIOS´), BMREAD);
    if B.Size > 0 then begin
      try
        ClientDataSet2FOTO.SaveToStream(a);
        ClientDataSet2COMENTARIOS.SaveToStream(B);
      Finally
        A.Destroy;
        b.Destroy;
      end;
    end;
    
    ClientDataSet2.Post;
    ProgressBar1.Position := ProgressBar1.Position +1;
    ClientDataSet1.Next;
  end;

  ClientDataSet2.ApplyUpdates(0);
  
end;




[/code]


Renatacoimbra

Renatacoimbra

Curtidas 0

Respostas

Cabelo

Cabelo

26/04/2006

Colega....


você está usando o método errado.....

use assim na linha para salvar na 2ª tabela..

clientdataset2.LOADFROMSTREAM(A);

e não clientdataset2.SaveToStream(A);

dessa forma você está carregando para a variável A o conteúdo do dataset 2

um abraço


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/04/2006

Oi Cabelo, obrigada pela resposta, usando o código abaixo está dando outro erro, BitMap Image is not valid.

a imagem que tenho na tabela 1 é jpg, será se o erro é derivado disso ?


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  A,B : TStream;
Begin

  ClientDataSet1.Open;
  ClientDataSet2.Open;
  ClientDataSet1.First;
  ProgressBar1.Position := 0;
  ProgressBar1.Max := ClientDataSet1.RecordCount;

  While not ClientDataSet1.Eof do begin
    ClientDataSet2.Append;
    ClientDataSet2ID.AsInteger         := ClientDataSet1ID.AsInteger;
    ClientDataSet2DESCRICAO.AsString   := ClientDataSet1DESCRICAO.AsString;

    A := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´FOTO´), BMREAD);
    B := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´COMENTARIOS´), BMREAD);

    try
      ClientDataSet2FOTO.LoadFromStream(a);
      ClientDataSet2COMENTARIOS.LoadFromStream(B);
    Finally
      A.Destroy;
      b.Destroy;
    end;
    
    ClientDataSet2.Post;
    ProgressBar1.Position := ProgressBar1.Position +1;
    ClientDataSet1.Next;
  end;

  ClientDataSet2.ApplyUpdates(0);
  
end;




GOSTEI 0
Cabelo

Cabelo

26/04/2006

Qual é exatamento o campo blob que você criou para armazenar a imagem?????


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/04/2006

Tipo do do campo Imagem:

[list:e816073acb]
BLOB sub_type 0 segment size 80[/list:u:e816073acb][/code]


GOSTEI 0
Cabelo

Cabelo

26/04/2006

Renata...

Verifique se existe realmente uma imagem no campo que você está tentando gravar... e veja se no banco de dados o campo blob não esta setado para not null.

Debug o programa desde a primeira linha desta rotina e me fale em qual linha está dando o erro...


GOSTEI 0
Renatacoimbra

Renatacoimbra

26/04/2006

Todos os campos tem imagem sim, o campo não esta not null, o erro está acontecendo nas linhas abaixo:



      ClientDataSet2FOTO.LoadFromStream(a);
      ClientDataSet2COMENTARIOS.LoadFromStream(B);



GOSTEI 0
Cabelo

Cabelo

26/04/2006

Tente gravar primeiro os dados que não forem blobs, incluisive a chave primária... depois selecione somente a chave e o campo que deseja gravar a imagem, dê um edit e inclua a rotina para gravar...

assim :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
A,B : TStream;
Begin

ClientDataSet1.Open;
ClientDataSet2.Open;
ClientDataSet1.First;
ProgressBar1.Position := 0;
ProgressBar1.Max := ClientDataSet1.RecordCount;

while not ClientDataSet1.Eof do
begin
ClientDataSet2.Append;
ClientDataSet2ID.AsInteger := ClientDataSet1ID.AsInteger;
ClientDataSet2DESCRICAO.AsString := ClientDataSet1DESCRICAO.AsString;
ClientDataSet2.ApplyUpdates(0);
ClientDataSet3.Open;
ClientDataSet3.Edit;
A := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´FOTO´), BMREAD);
B := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName(´COMENTARIOS´), BMREAD);

try
ClientDataSet3FOTO.LoadFromStream(a);
Finally
A.Free;
end;
clientDataSet33.ApplayUpdates;
ProgressBar1.Position := ProgressBar1.Position +1;
ClientDataSet1.Next;
end;

end;


só para testar.... se funcionar... é só implementar para os outros campos BLOB..


GOSTEI 0
POSTAR