1

在我的项目中,我使用 mysql.pas 来处理 MySql 数据库,所以我有这个表结构:

Table Name :CarsTbl
ID  int 10
CarName varchar 100
Car_Img longblob 0

我使用这张表来保存每辆汽车的名称和图片。保存程序运行良好。

但问题是当我使用以下程序获取 Car_Img 时:

procedure GetCarImage(const MyCarName:String;TrgStream:TMemoryStream);
var
  query_string: String;
  rCount: Integer;
  mySQL_Res: PMYSQL_RES;
  LibH: PMYSQL;
  Row: PMYSQL_ROW;
  iLen:PMYSQL_LENGTHS;
begin
   mySQL_Res := nil;
   Try
    Try
   query_string := 'SELECT CarName,Car_Img FROM CarsTbl WHERE CarName="'+MyCarName+'"';
   mysql_real_query(LibH, PAnsiChar(query_string), Length(query_string));
    mySQL_Res := mysql_store_result(LibH);
    Try
    rCount := mysql_num_rows(mySQL_Res);
        If rCount > 0 Then Begin
          Repeat
            Row := mysql_fetch_row(mySQL_Res);
            iLen:= mysql_fetch_lengths(mySQL_Res);
            If Row <> nil Then Begin
            TrgStream.position :=0;
            //Row^[1] ==== Car_Img Blob Field
            TrgStream.WriteBuffer(Row^[1],iLen[1]);
            End;
          Until Row = nil;
          end;
      Finally
        mysql_free_result(mySQL_Res);
        mySQL_Res := nil;
        Row := nil;
      End;
    Finally
      mysql_close(LibH);
    End;

  Finally
    LibH := nil;
  End;
end;

我得到汽车图像,但文件格式错误,标题让我解释一下:Audi_Car 图像保存为 Png 图像,但是当我加载它的图像时,我总是这样得到:

在此处输入图像描述

那么请问如何纠正呢?我的 Sql 查询中是否有任何错误?

PS:我在另一个地方创建了 TrgStream。

这是我的 LoadCarImage 程序:

Procedure LoadCarImage();
var
CarStrm:TMemoryStream;
begin
CarStrm:=TMemoryStream.Create;
Try
GetCarImage('Audi',CarStrm);
CarStrm.SaveToFile('audi.png');
finally
    CarStrm.Free;
    end;
end;

非常感谢

4

2 回答 2

3

你不应该使用

  Repeat ...  until

CarName不是唯一的。因此,如果您的表中有多个Audi,您也会创建一个无效的图像文件。

试试看

德尔福5

编辑:


TrgStream.WriteBuffer(Row^[1],iLen[1]);

WriteBuffer 获取第一个指针并写入整个 Row 的内容。
现在在您的 .png 文件中

ID00CarName00Car_Img 

9Wî00f­î00Audi00‰PNG.......

我更喜欢通过数组走很长一段路,只是为了看看我得到了什么。

现在你已经测试过了。我们在当前流的写入中没有发现错误。 我们用这个
代替
TrgStream.WriteBuffer(Row^[1],iLen[1]);

TrgStream.WriteBuffer(Row^[1]^,iLen[1]);

procedure GetCarImage(const MyCarName:String;TrgStream:TMemoryStream);
var
  [...]


begin
  [...]

    query_string := 'SELECT CarName,Car_Img FROM cars WHERE CarName="Audi"';
    mysql_real_query(LibH, PAnsiChar(query_string), Length(query_string));
    mySQL_Res := mysql_store_result(LibH);
    Try
    rCount := mysql_num_rows(mySQL_Res);
        If rCount > 0 Then Begin

            Row := mysql_fetch_row(mySQL_Res);
            iLen:= mysql_fetch_lengths(mySQL_Res);
            If Row <> nil Then Begin
            TrgStream.position :=0;
            //Row^[1] ==== Car_Img Blob Field
            TrgStream.WriteBuffer(Row^[1]^,iLen[1]);
    [...]
于 2013-07-20T03:51:58.917 回答
0

我遇到了同样的问题。我想从 mysql glob 字段中读取 emf(图片元文件)。我像这样解决了它。

var
  text_t1:string;
  Stream: TStream;

begin
  text_t1:='';
  text_t1:=' select emf_glob from table ';
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(text_t1);
  ADOQuery1.Open;
  ADOQuery1.first;

  Stream:= TMemoryStream.Create;
  Stream := ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('emf_glob'), bmRead); 
  Stream.Position:=0;
  DBImage1.Picture.LoadFromStream(Stream);
  Stream.Free;
于 2021-02-03T08:24:32.387 回答