swbk Novato

Registrado: Terça-Feira, 6 de Janeiro de 2015 Mensagens: 27
|
Enviada: Sex Jul 03, 2015 2:40 pm Assunto: [ADO] Campo BLOB |
|
|
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.
Alguem 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:
| Código: |
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; |
|
|