尝试将 .bmp 从 PC 保存到数据库 blob 字段
Trying to save a .bmp from PC to a database blob field
我正在尝试将 .bmp 从我的 PC 保存到包含 blob
字段的数据库。
我目前正在使用此处的代码:
How to insert image into database using TADOQuery Component Only
我创建了一个新表单并在其中添加了必要的组件。
表单如下所示:
- 它包含以下内容:3
TButton
、1 TOpenDialog
和 1 TImage
- 按钮 Salveaza(保存)是
Button3
并且 ModalResult
设置为 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
,以及我正在使用的其他东西(如 DataSource
、DataSet
、SQLConnection
等等。)数据模块被命名为 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 的数据模块上,包含以下内容: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.
刚刚将使用查询替换为使用数据集,这似乎已经解决了问题,而且我原来的 post / 问题是错误的,因为我一直在混淆问题。仍然,对任何经历同样的事情的人都有好处。
感谢 Sertac Akyuz
我正在尝试将 .bmp 从我的 PC 保存到包含 blob
字段的数据库。
我目前正在使用此处的代码:
How to insert image into database using TADOQuery Component Only
我创建了一个新表单并在其中添加了必要的组件。
表单如下所示:
- 它包含以下内容:3
TButton
、1TOpenDialog
和 1TImage
- 按钮 Salveaza(保存)是
Button3
并且ModalResult
设置为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
,以及我正在使用的其他东西(如DataSource
、DataSet
、SQLConnection
等等。)数据模块被命名为 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 的数据模块上,包含以下内容: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.
刚刚将使用查询替换为使用数据集,这似乎已经解决了问题,而且我原来的 post / 问题是错误的,因为我一直在混淆问题。仍然,对任何经历同样的事情的人都有好处。
感谢 Sertac Akyuz