尝试将.bmp从PC保存到数据库blob字段

时间:2016-11-01 09:32:33

标签: mysql sql delphi stream blob

我正在尝试将.bmp从我的PC保存到包含blob字段的数据库。

我目前正在使用此处的代码:

How to insert image into database using TADOQuery Component Only

我已经创建了一个新表单,并在那里添加了必要的组件。

这是表单的样子: enter image description here

  • 它包含以下内容:3 TButton,1 TOpenDialog和1 TImage
  • 按钮 Salveaza 保存)为Button3ModalResult设为mrOk
  • 按钮 Incarca Imagine 加载图片)为Button1
  • 按钮取消Button2,已勾选Cancel属性且ModalResult设为mrAbort

Incarca Imagine Button1 )按钮的代码如下:

procedure TaddImagineForm.Button1Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
    begin
      Image1.Picture.LoadFromFile(OpenDialog1.FileName);
    end;
end;

名为 Salveaza Button3 )的按钮代码为:

procedure TaddImagineForm.Button3Click(Sender: TObject);
var
          Field: TBlobField;
          Stream: TStream;
begin
          if dbmodule.comenziQuery.Active and (Image1.Picture.Graphic <> nil) then
          begin
             dbmodule.comenziQuery.Insert;
             Field := TBlobField(dbmodule.comenziQuery.FieldByName('pscreen')); // ensure it ís a blob
             Stream := dbmodule.comenziQuery.CreateBlobStream(Field, bmWrite);
             try
                Image1.Picture.Graphic.SaveToStream(Stream);
             finally
                Stream.Free;
                dbmodule.comenziQuery.Post;
             end;
          end;
end;
  • 我正在使用的TSQLQuery(名为 comenziQuery )位于Data module,以及我正在使用的其他内容(如DataSourceDataSetSQLConnection等等。)数据模块名为 dbmodule
  • 应保存.bmp图像的数据库中的列名为 pscreen ,并设置为mediumblob类型。

会发生什么(可能是我的新手观点)

  • 所选行的名为 pscreen blob字段现在应包含我之前使用TOpenDialog选择的.bmp,按 Incarca Imagine 按钮

实际上是什么

  • 单击保存按钮后,表单将关闭,但所选行不会在其blob字段中使用bmp图像进行更新。没有错误,没有警告,没有。该行的字段保持为NULL。

修改

感谢评论中的Dsm,他指出我正在使用插入,这会添加一条新记录,而不会更新我正在选择的记录。 我指的是这一行:dbmodule.comenziQuery.Insert; 需要以某种方式更改代码以更新我正在选择的记录。

对于Delphi / SQL来说,这是一个非常新的东西,所以如果看起来我正在敲打墙壁并做正好相反的话,我会道歉。

我正在使用 Rad Studio 10 Seattle ,数据库为MYSQL,数据库组件位于名为dbmodule的数据模块上,并包含以下内容:TSimpleDataSetTSQLQueryTDataSourceTSQLConnection - 它们是dbExpress组件。

谢谢!

1 个答案:

答案 0 :(得分:0)

以下代码有效并且成功提供了我需要的功能

procedure TaddImagineForm.Button3Click(Sender: TObject);
var
          Field: TBlobField;
          Stream: TStream;
begin
          dbmodule.comenziDataSet.Active := True;
          if (Image1.Picture.Graphic <> nil) then
          begin
             dbmodule.comenziDataSet.Edit;
             Field := TBlobField(dbmodule.comenziDataSet.FieldByName('pscreen')); // ensure it ís a blob
             Stream := dbmodule.comenziDataSet.CreateBlobStream(Field, bmWrite);
             try
                Image1.Picture.Graphic.SaveToStream(Stream);
             finally
                Stream.Free;
                dbmodule.comenziDataSet.Post;
             end;
          end;
end;


end.

刚刚使用DataSet替换了Query并且似乎解决了它,我的原始帖子/问题也是错误的,因为我一直在混淆问题。对于经历同样的人来说,这仍然是好事。

感谢Sertac Akyuz