在我的项目中我使用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查询中有任何错误吗?
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;
非常感谢
答案 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;