在我的项目中,我使用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图片,但当我加载它的图片时,我总是这样得到它:
那么请你怎么纠正这个?我的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]);
[...]