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

标签 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(Save)是 Button3 并且 ModalResult 设置为 mrOk
  • 按钮Incarca Imagine(加载图像)是Button1
  • Button CancelButton2,勾选了 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)位于 数据模块 中,连同我正在使用的其他东西(像 DataSourceDataSetSQLConnection 等等。)数据模块被命名为 dbmodule
  • 数据库中应保存 .bmp 图像的列名为 pscreen 并设置为 mediumblob 类型。

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

  • 所选行的名为 pscreenblob 字段现在应该包含我之前使用 TOpenDialog 选择的 .bmp,方法是按 < em>Incarca Imagine 按钮

到底发生了什么

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

编辑

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

对 Delphi/SQL 非常陌生,所以如果我似乎在用头撞墙并做完全相反的事情,我深表歉意。

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

谢谢!

最佳答案

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

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.

只是将使用查询替换为使用数据集,这似乎已经解决了它,而且我原来的帖子/问题是错误的,因为我一直在混淆这些问题。尽管如此,对于任何经历过同样的事情的人来说还是有好处的。

感谢 Sertac Akyuz

关于mysql - 尝试将 .bmp 从 PC 保存到数据库 blob 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40357324/

相关文章:

sql - 连接字符串中的转义空格

mysql - SQL 查询查找并比较给定手机位置的距离

c# - OleDb SQL 查询中的两个内部联接

php - 如何通过 POST 方法传递表单输入值以外的值

mysql - 我如何根据包含 ascii 代码 0x02 的字符串选择行?

sql - 在单个查询中将行插入多个表,从涉及的表中选择

android - 如何使用 FireMonkey for Delphi XE5 检测/处理屏幕旋转

javascript - Delphi CEF4 Chromium - 执行 javascript 操作

javascript - 使用 PHP、MySQL 和 jQuery 自动填写输入表单

php - Mysql查询总是返回零