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

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

我用这个表保存每辆车的名字和图片。
保存程序运行得很好。
但问题是当我在车里使用以下程序时:
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;

我得到了汽车图像,但文件头格式不正确,让我解释一下:
奥迪汽车图片被保存为Png图片,但当我加载它的图片时,我总是这样得到它:
mysql - 来自MySql的Delphi加载Blob-LMLPHP
那么请你怎么纠正这个?我的Sql查询有错误吗?
备注:我在另一个地方创建TrgStream。
下面是我的LoadCarImage程序:
Procedure LoadCarImage();
var
CarStrm:TMemoryStream;
begin
CarStrm:=TMemoryStream.Create;
Try
GetCarImage('Audi',CarStrm);
CarStrm.SaveToFile('audi.png');
finally
    CarStrm.Free;
    end;
end;

非常感谢

最佳答案

你不应该用

  Repeat ...  until

CarName不是唯一的。因此,如果表中有多个Audi,则还将创建一个无效的图像文件。
试试看
德尔菲5
编辑:

TrgStream.WriteBuffer(Row^[1],iLen[1]);
WriteBuffer接受第一个指针并写入整行的内容。
现在在.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]);
    [...]

09-16 07:05