Вы можете использовать поля BLOB. Предположим, у вас есть экземпляр TAdoDataset, и вы хотите отредактировать поле изображения. Вы можете использовать такой код:
AStream := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(AStream);
AStream.Position := 0;
if ADODataSet1.Active then
begin
ADODataSet1.Edit;
TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
ADODataSet1.Post;
end;
finally
AStream.Free;
end;
Вы также можете использовать элемент управление DBImage, который данные известны, и загружая любое изображение в это означает, что изображение загружается в поле.
Чтобы получить данные поля, и загрузить его в экземпляр TImage, вы можете иметь такой код:
var
AStream : TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
if ADODataSet1.Active then
begin
TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
AStream.Position := 0;
Image1.Picture.Graphic.LoadFromStream(AStream);
end;
finally
AStream.Free;
end;
end;
Предупреждение: В этом коде я предположил Image1.Picture.Graphic не Nil , Если ваш контроль изображения пуст, то свойство Picture.Graphic равно Nil, а приведенный выше код даст вам нарушение доступа. У вас есть два варианта, чтобы избежать этого:
- Вместо того, чтобы сохранить изображение в поток памяти, сохранить его в локальный файл темпа, а затем загрузить изображение с помощью Image1.Picture.LoadFromFile. LoadFromFile проверяет расширение файла, и в соответствии с расширением файла создает подходящий объект из одного из классов TGraphics. Для примера , если файл является JPEG, он создает экземпляр класса TJPEGImage и загружает данные в него.
- Вы сами создаете нужный объект и назначаете его Image1.Picture.Graphic. Например, , если ваше изображение JPEG, создайте экземпляр TJPEGImage , загрузите в него поток , затем назначьте его Image1.Picture.Graphic.
Если вы вставляете или обновляете запись БД с помощью SQL-команд (INSERT/UPDATE), вы должны использовать SQL-параметры в своей команде SQL, тогда вы можете загрузить поток в параметр, который представляет ваше поле изображения:
///Sample SQL Command:
INSERT INTO My_Table_Name
(MyField1, MyField2)
VALUES (:prmMyField1, :prmMyField2)
/// Sending INSERT command to DB server
var
AStream : TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
Image1.Picture.Graphic.SaveToStream(AStream);
AStream.Position := 0;
// Save some random data into the first param
ADOCommand1.Parameters.ParamByName('prmMyField1').Value := 1;
// Save image stream into the second param
ADOCommand1.Parameters.ParamByName('prmMyField2').LoadFromStream(AStream);
ADOCommand1.Execute;
finally
AStream.Free;
end;
end;
В Delphi XE5 ParamByName ('param'). LoadFromStream требует параметра добавления ftBlob – Brendan