Ir para conteúdo
Fórum Script Brasil
  • 0

[ADO] Campo BLOB


Samuel Sewaybricker

Pergunta

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 para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...