我正在尝试将 .bmp 从我的 PC 保存到包含 blob
字段的数据库。
我目前正在使用这里的代码:
How to insert image into database using TADOQuery Component Only
我创建了一个新表单并在其中添加了必要的组件。
- 它包含以下内容:3 个
TButton
、1 个TOpenDialog
和 1 个TImage
- 按钮 Salveaza(Save)是
Button3
并且ModalResult
设置为mrOk
- 按钮Incarca Imagine(加载图像)是
Button1
- Button Cancel 是
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)位于数据模块
中,连同我正在使用的其他东西(像DataSource
、DataSet
、SQLConnection
等等。)数据模块被命名为 dbmodule - 数据库中应保存 .bmp 图像的列名为 pscreen 并设置为
mediumblob
类型。
应该发生什么(可能是我新手的观点)
- 所选行的名为 pscreen 的
blob
字段现在应该包含我之前使用TOpenDialog
选择的 .bmp,方法是按 < em>Incarca Imagine 按钮
到底发生了什么
- 单击保存 按钮后,表单将关闭,但所选行不会使用其 blob 字段中的 bmp 图像进行更新。没有错误,没有警告,什么都没有。该字段对于该行保持为 NULL。
编辑
感谢 Dsm 在评论中指出我正在使用插入,它会添加一条新记录,而不是更新我选择的记录。
我指的是这一行:dbmodule.comenziQuery.Insert;
需要以某种方式更改代码以更新我正在选择的记录。
对 Delphi/SQL 非常陌生,所以如果我似乎在用头撞墙并做完全相反的事情,我深表歉意。
我正在使用 Rad Studio 10 Seattle,数据库是 MYSQL
,数据库组件位于名为 dbmodule 的数据模块上,包含以下内容: TSimpleDataSet
、TSQLQuery
、TDataSource
、TSQLConnection
- 它们是 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/