Вы можете использовать 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 isне ноль.Если ваш элемент управления изображением пуст, тогда свойство 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;