Сохранить вариант массива байтов в параметризованный запрос

В обработчике событий TDataSetProvider.OnBeforeUpdate ClientDataSet, который содержит поле большого двоичного объекта, я хочу присвоить значение DeltaDS.Fields[i].NewValue который, конечно, в данном случае представляет собой массив байтов Variant для значения blobField - для параметра Query.Parameter для Update утверждение, например Update MyTable set myBlob = :myBlob where id = :id

Очевидно, я делаю из этого беспорядок.

Какой элегантный способ сделать это? Спасибо

    i := 0;
    while (i < DeltaDS.Fields.Count) do
    begin
       // not all the code, just the bit relevant to the question
       if (DeltaDS.Fields[i].DataType = TFieldType.ftBlob) then
       begin
         // field value is an Array of Byte
         // copy it first
         ab := DeltaDS.Fields[i].NewValue; // no error here
         if (Length(ab) * SizeOf(Char)) > 0 then
         begin
           Stream := TMemoryStream.Create;
           try
             // write array of byte to stream
             Stream.WriteBuffer(ab[0], Length(ab) * SizeOf(Char));
             Stream.Position := 0; // rewind
             // load parameter from stream
             QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).DataType := ftBlob;
             QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).LoadFromStream(Stream);
           finally
             Stream.Free;
           end;
         end;
       end;
       Inc(i);
     end;

0 ответов

Другие вопросы по тегам