//取图片
procedure TForm1.BitBtn1Click(Sender: TObject);
var
mm:Variant;
MyStream,MyStream1:TMemoryStream;
MyJPG:TjpegImage;
begin
with ADOQuery1 do
begin
close;
SQL.Text := 'select * from test where ID=1';
Open; if not eof then
begin
MyStream := TMemoryStream.Create;
if FieldByName('Pic').IsNull then
begin
showmessage('为空');
Exit;
end; TBlobField(FieldByName('Pic')).SaveToStream(MyStream);
MyStream.Position := 0;
MyJPG := TjpegImage.Create;
Image2.Picture.Graphic := nil;
Image2.Picture.Graphic := MyJPG;
Image2.Picture.Graphic.LoadFromStream(MyStream);
MyJPG.Free;
MyStream.Free;
end
else
showmessage('不存在');
end;
end;//存图片
procedure TForm1.Button1Click(Sender: TObject);
var
PicStream:TMemoryStream;
begin
PicStream := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(PicStream);
with ADOQuery1 do
begin
SQL.Text := 'insert into test(Pic)values(:Pic1)';
Parameters.ParamByName('Pic1').LoadFromStream(PicStream,ftBlob);
ExecSQL;
end;
PicStream.Free;
end;现在在取图片显示在image中的时候老是提示invalid class typecast
procedure TForm1.BitBtn1Click(Sender: TObject);
var
mm:Variant;
MyStream,MyStream1:TMemoryStream;
MyJPG:TjpegImage;
begin
with ADOQuery1 do
begin
close;
SQL.Text := 'select * from test where ID=1';
Open; if not eof then
begin
MyStream := TMemoryStream.Create;
if FieldByName('Pic').IsNull then
begin
showmessage('为空');
Exit;
end; TBlobField(FieldByName('Pic')).SaveToStream(MyStream);
MyStream.Position := 0;
MyJPG := TjpegImage.Create;
Image2.Picture.Graphic := nil;
Image2.Picture.Graphic := MyJPG;
Image2.Picture.Graphic.LoadFromStream(MyStream);
MyJPG.Free;
MyStream.Free;
end
else
showmessage('不存在');
end;
end;//存图片
procedure TForm1.Button1Click(Sender: TObject);
var
PicStream:TMemoryStream;
begin
PicStream := TMemoryStream.Create;
Image1.Picture.Graphic.SaveToStream(PicStream);
with ADOQuery1 do
begin
SQL.Text := 'insert into test(Pic)values(:Pic1)';
Parameters.ParamByName('Pic1').LoadFromStream(PicStream,ftBlob);
ExecSQL;
end;
PicStream.Free;
end;现在在取图片显示在image中的时候老是提示invalid class typecast
你使用MySQL4.1以上的版本吗?我们公司使用ADO+MYODBC3.51+MySQL4.1.12用Borland C++Builder来开发,
开始也是由于多国语言的问题,无法存取MySQL中的二进制数据,现在成功解决了,
确认一下,你的开发环境是什么?
TBlobField(FieldByName('Pic')).SaveToStream(MyStream);这句有问题,提示invalid class typecast
//加载(存)
var
sFileName : String;
function BlobConectToString(Const FileName : String) : String;
begin
with TFileStream.Create(FileName, fmOpenRead) do
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size)
finally
Free;
end;
end;
begin
if OpenDialog1.Execute then
begin
sFileName := OpenDialog1.FileName;
ADOQuery1.Edit;
ADOQuery1.FieldByName('Blobs').AsString := BlobConectToString(sFileName);
ADOQuery1.Post;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
//显示(取)
var
sFileName : String;
Bs : TADOBlobStream;
begin
Bs := TADOBlobStream.Create(TBlobField(ADOQuery1.FieldByName('Blobs')), bmRead);
try
sFileName := ExtractFilePath(Application.ExeName) + 'tmpBlob';
sFileName := sFileName + '.' + ADOQuery1.FieldByName('文件扩展名').AsString;
Bs.SaveToFile(sFileName);
OleContainer1.CreateObject(sFileName, False);
finally
Bs.Free;
end;
end;
TADOBlobStream.Create(TBlobField(FieldByName('Pic')), bmRead);提示invliad argument,可能不能转换为TBlobField型,我测了一下该字段,发现该字段类型为ftVarBytes
加个query试试
TEMBMP.ASSIGN(JPEG)
TBlobField(FieldByName('Pic')).SaveToStream(MyStream);
好像是转换为TBlobField时出错