Delphi从MySql加载Blob

时间:2013-07-20 00:17:38

标签: mysql delphi

在我的项目中我使用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图像,但是当我加载图像时,我总是这样:

enter image description here

那么请问怎么纠正这个?我的Sql查询中有任何错误吗?

P.S:我在其他地方创建了TrgStream。

这是我的LoadCarImage程序:

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

2 个答案:

答案 0 :(得分:3)

你不应该使用

  Repeat ...  until

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

尝试

Delphi5

编辑:

使用
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]);
    [...]

答案 1 :(得分: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;