gpt4 book ai didi

delphi - 如何仅使用 TADOQuery 组件将图像插入数据库

转载 作者:行者123 更新时间:2023-12-03 15:16:48 27 4
gpt4 key购买 nike

我有一个简单的基本问题,我尝试使用 Insert 语句将图像插入数据库,其他列值也使用 TADOQuery 组件。

由于代码已经由某人编写,因此我想在此处放置一些虚拟示例代码,以供您澄清相应的步骤。

请注意,这与 TQuery 组件配合得很好,因为我用 TADOQuery 组件替换 TQuery,所以我必须使用仅限 TADOQuery 组件。

相同的代码应该适用于 SQL Server 和 Oracle 数据库。

我尝试在其中插入图像的列的数据类型是 SQL Server 数据库中的 VarBinary 类型。

使用 TQuery 将图像插入表中

  1. 使用TImage创建图像。

    msBinImgStream := TMemoryStream.Create; 
    imgCustom := TImage.Create(self);
    imgJpg := TJPEGImage.Create;
  2. 将图像转换为 TJpegImage 并保存到 TMemoryStream

    imgJpg.Assign(imgCustom.Picture.Bitmap); 
    imgJpg.SaveToStream(msBinImgStream);
  3. 使用TQuery组件的SetBlobdata属性插入数据库。

    sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; 
    qryTQuery.SQL.Add(sSQL);
    qryTQuery.ParamByName('pBlob').SetBlobData(msBinImgStream.Memory, msBinImgStream.Size);
    qryTQuery.ExecSQL;

现在使用 TADOQuery 做同样的事情:

  1. 能够创建图像。
  2. 将其转换为 TJpeg 并保存到 TMemoryStream
  3. 尝试使用 LoadFromStream(stream, ftBlob) 将图像插入数据库,但收到错误“字符串或二进制值可能被截断”

    sSql := 'INSERT INTO Table_Name(Column1, Column2, Column_Image) VALUES ( ''' + Value1 + ''', ''' + Value2 + ''', :pBlob)'; 
    qryADOQuery.SQL.Add(sSQL);
    qryADOQuery.Parameters.ParamByName('pBlob').LoadFromStream(msBinImgStream, ftBlob);
    qryADOQuery.ExecSQL;

请告诉我,通过这种方法我应该如何克服这个问题。

最佳答案

保存:

var
Field: TBlobField;
Stream: TStream;
begin
if ADOQuery.Active and (Image.Picture.Graphic <> nil) then
begin
ADOQuery.Insert;
Field := TBlobField(ADOQuery.FieldByName('ImageData')); // ensure it ís a blob
Stream := ADOQuery.CreateBlobStream(Field, bmWrite);
try
Image1.Picture.Graphic.SaveToStream(Stream);
finally
Stream.Free;
ADOQuery.Post;
end;
end;
end;

或者使用TADOBlobStream代替TStream:

var
...
Stream: TADOBlobStream;
begin
...
Stream := TADOBlobStream.Create(Field, bmWrite);
...

加载:

var
Field: TBlobField;
Stream: TStream;
Jpg: TJPEGImage;
begin
if ADOQuery.Active then
begin
Field := TBlobField(ADOQuery.FieldByName('ImageData'));
Stream := ADOQuery.CreateBlobStream(Field, bmRead);
Jpg := TJPEGImage.Create;
try
Jpg.LoadFromStream(Stream);
Image1.Picture.Graphic := Jpg;
finally
Jpg.Free;
Stream.Free;
end;
end;
end;

关于delphi - 如何仅使用 TADOQuery 组件将图像插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com