Fórum TStream e Blob ? #320021

26/04/2006

0

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

Responder

Posts

26/04/2006

Cabelo

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


Responder

Gostei + 0

26/04/2006

Renatacoimbra

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;




Responder

Gostei + 0

26/04/2006

Cabelo

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


Responder

Gostei + 0

26/04/2006

Renatacoimbra

Tipo do do campo Imagem:

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


Responder

Gostei + 0

26/04/2006

Cabelo

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...


Responder

Gostei + 0

26/04/2006

Renatacoimbra

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);



Responder

Gostei + 0

26/04/2006

Cabelo

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..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar