Jump to content
Fórum Script Brasil
  • 0

[ADO] Campo BLOB


Samuel Sewaybricker
 Share

Question

Olá pessoal.

Estou com a seguinte situação, tenho um ADOQuery e ClientDataSet linkados, tudo está certinho, o problema é que tem um campo blob e com o blobType igual a ftMemo.

Este blob está ligado a um DBMemo, o problema ocorre quando vou dar o post do dataset, número Hex inválido, a solução para isso fiz uma função que converte o texto string do memo e converte para hexadecimal, com isso o fluxo segue normalmente. Contudo fiz um teste onde após o post eu retorno para a tela do registro e como a função converteu o meu texto do memo para hexa o memo mostra o value convertido rs.

Analisei melhor e vi que tinha que fazer essa conversão antes do update final do registro, então no meu DataSetProvider eu utilizei o evento BeforeUpdateRecords, ai ficou "100%".

Com apenas um campo blob ficou show, o problema atual que peço a ajuda de vocês é o seguinte, quando a query possui mais de um blob(3 por exemplo) quando chega na atribuição do valor convertido, eu não sei como e nem porque, o valor do último campo blob some, fica nulo! Isso que nem chegou nesse campo ainda para converter.

Depurei todos passos do DBClient, DB, ADODB e nada.

alguém já passou por isso ou sabe algo que possa iluminar??

Segue o código do evento, note que não é feito nada de mais que possa interferir no valor do campo até que chegue a vez dele de converter:

procedure TRDataSetProvider.CustomDataSetProviderBeforeUpdateRecord(
  Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
  UpdateKind: TUpdateKind; var Applied: Boolean);
var
   i : integer;

   function IsConnectedToOracle(Source: TRADOQuery): Boolean;
   begin
     Result := (Pos('ORACLE', UpperCase(Source.Connection.Provider))>0);
   end;

begin
  if (UpdateKind <> ukDelete) and IsConnectedToOracle(TRADOQuery(SourceDS)) then
  begin
     for i := 0 to DeltaDs.FieldCount - 1 do
     begin
        if (DeltaDs.Fields.Fields[i] is TBlobField) and
           (TBlobField(DeltaDs.Fields.Fields[i]).BlobType = ftMemo) then
        begin
           if DeltaDs.Fields.Fields[i].NewValue <> Unassigned then
           begin
              DeltaDS.Edit;
              DeltaDs.Fields.Fields[I].Value := StringToHexa(DeltaDS.Fields.Fields[I].Value);
              DeltaDS.Post;
           end;
        end;
     end;
  end;
end;
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...