2010-11-17 3 views
1

Ищите образец кода, предпочтительно используя TADOConnection.Как сохранить (Jpeg) изображение на MySql и получить его позже?

Я хочу сохранить TPicture TImage в базу данных MySql (желательно ODBC, а не только MySql), а позже я хочу собрать TImage и получить изображение в свой свойство TPicture.

Любые фрагменты кода или ссылки на них?

ответ

11

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

  1. Вместо того, чтобы сохранить изображение в поток памяти, сохранить его в локальный файл темпа, а затем загрузить изображение с помощью Image1.Picture.LoadFromFile. LoadFromFile проверяет расширение файла, и в соответствии с расширением файла создает подходящий объект из одного из классов TGraphics. Для примера , если файл является JPEG, он создает экземпляр класса TJPEGImage и загружает данные в него.
  2. Вы сами создаете нужный объект и назначаете его 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; 
+0

В Delphi XE5 ParamByName ('param'). LoadFromStream требует параметра добавления ftBlob – Brendan

1

может быть, это может помочь вам:

http://www.scalabium.com/faq/dct0065.htm - сохранить компонент в потоке

и после этого сохранить поток в MySql

http://www.devarticles.com/c/a/Delphi-Kylix/Saving-Images-and-Binary-Files-to-a-Database-with-Delphi-2/

и http://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm

надеюсь, это то, что вы хотите, и я хорошо понимаю, что вы спрашиваете.

наилучшими пожеланиями,

2

Вас хранящие само изображение в MySQL? Почему ты бы так поступил? В этом отношении сделано несколько контрольных показателей, которые заключают, что эта практика не является масштабируемой.

Лучше всего сохранить все ваши изображения на диске. & есть таблица, содержащая ссылки на все изображения.

Простой запрос в Google - «хранилище изображений mysql» или «Тесты хранилища изображений mysql» предоставит вам соответствующие ссылки.

+0

+1 Вы, конечно, правы, и я сделаю так. Спасибо – Mawg

Смежные вопросы