Сохранить вариант массива байтов в параметризованный запрос
В обработчике событий 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;