用DMIMAGE控件直接和数据库绑定,用的是ado连接为何保存大于100k的jpg图片是报"Bitmap image is not valit"错误.代码如下:
procedure TForm1.DBImage1DblClick(Sender: TObject);
var
bmpp:TBitmap;
jpegp:TJPEGImage;
mstrm:Tmemorystream;
begin
if OpenDialog1.Execute then
begin
jpegp:=TJPEGImage.Create; mstrm:=Tmemorystream.Create;
mstrm.Clear;
mstrm.Position:=0;
if pos('JPG',opendialog1.filename)> 0 then
begin
jpegp.LoadFromFile(opendialog1.filename);
bmpp.Assign(jpegp);
bmpp.SaveToStream(mstrm);
end
else
mstrm.LoadFromFile(opendialog1.FileName);
Query1.Edit;
//TBlobField(Query1.FieldByName('照片')).LoadFromFile(OpenDialog1.FileName);
TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm);//运行到此报错
Query1.Post;
jpegp.Free;
bmpp.Free;
mstrm.Free;
end;end;
procedure TForm1.DBImage1DblClick(Sender: TObject);
var
bmpp:TBitmap;
jpegp:TJPEGImage;
mstrm:Tmemorystream;
begin
if OpenDialog1.Execute then
begin
jpegp:=TJPEGImage.Create; mstrm:=Tmemorystream.Create;
mstrm.Clear;
mstrm.Position:=0;
if pos('JPG',opendialog1.filename)> 0 then
begin
jpegp.LoadFromFile(opendialog1.filename);
bmpp.Assign(jpegp);
bmpp.SaveToStream(mstrm);
end
else
mstrm.LoadFromFile(opendialog1.FileName);
Query1.Edit;
//TBlobField(Query1.FieldByName('照片')).LoadFromFile(OpenDialog1.FileName);
TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm);//运行到此报错
Query1.Post;
jpegp.Free;
bmpp.Free;
mstrm.Free;
end;end;
这应该是保存到流吧,怎么还是提取
procedure TForm1.DBImage1DblClick(Sender: TObject);
var
bmpp:TBitmap;
jpegp:TJPEGImage;
mstrm:Tmemorystream;
begin
if OpenDialog1.Execute then
begin
Query1.Edit;
if pos('JPG',opendialog1.filename)<=0 then
begin
mstrm:=Tmemorystream.Create;
mstrm.Clear;
mstrm.Position:=0;
jpegp:=TJPEGImage.Create;
bmpp :=TBitmap.Create;
try
jpegp.LoadFromFile(opendialog1.filename);
bmpp.Assign(jpegp);
bmpp.SaveToStream(mstrm);
TBlobField(Query1.FieldByName('照片')).LoadFromStream(mstrm);
finally
jpegp.Free;
bmpp.Free;
mstrm.Free;
end;
end
else
begin
TBlobField(Query1.FieldByName('照片')).LoadFromFile(OpenDialog1.FileName);
end;
try
Query1.Post;
except
on E:Exception do
showmessage(E.Message);
end; end;end;
楼上说是dbimage的问题,但是我跟踪程序发现是在向数据库提交时报的错呀.
着急呀!!!!
首先建议升级ado至2.7以上
如果你用sqlserver数据库,最好不要用BDE,用ado试试
如果你用oracle,一定要升ado,且不能用microsoft ole db provider for oracle,要改用oracle provider for ole db
另外,建议用google,网上有n多类似问题
2.设BDE的blobs to cache为-1
如果还不能解决问题,只能改ADO了
在操作Oracle8I数据库的BLOB字段过程中发现,如果使用Delphi6提供的“BDE”或Windows操作系统提供的“ODBC”作为Oracle数据库的驱动程序,在对BLOB或CLOB类型字段进行读写操作时,能够读写的最大文件尺寸是32KB(这是隐含值),通过Delphi提供的BDE Administrator工具可以对该值进行修改(修改BLOB SIZE参数值),BLOB SIZE参数的取值范围是大于32KB,小于1000KB(1MB)。当读写的文件尺寸大于1MB时,会发生错误,无法将数据写入BLOB字段。如果使用Windows提供的“ADO”作为Oracle数据库驱动程序时,对BLOB字段的操作,没有小于32KB或少于1MB的限制,只要小于BLOB字段类型本身最大尺寸即可(小于4GB)。
所以,希望这个总结能给遇到我这样同样问题的人,不要再浪费时间了,如果你用的是BDE连接,最大只能存1000kb的图片,不要幻想任意修改blob size的值.切记!!!