我使用以下代码将图片存到SQL数据库中,但存的速度非常慢,而且原始图片只有500K,存到数据库中数据库体积增加9M多!!请问有什么别的高效的方法?
if Openp.Execute then
begin
try
Fpicture := Tpicture.Create;
Fpicture.LoadFromFile(OPENP.FileName );
fbmp := TBitmap.Create;
if not (Fpicture.Graphic is Ticon) then
fbmp.Assign(Fpicture.Graphic)
else
begin
fbmp.Width := Fpicture.Icon.Width;
fbmp.Height := Fpicture.Icon.Height;
fbmp.Canvas.Draw(0, 0, Fpicture.Icon);
end;
case ADOQ.State of
DsInsert:
begin
adoQ.FieldByName('pic').Assign(fbmp);
adoQ.post;
end;
DsEdit:
begin
ADOQ.FieldByName('pic').Clear;
adoQ.FieldByName('pic').Assign(fbmp);
adoQ.post;
end;
dsBrowse:
begin
ADOQ.Edit;
ADOQ.FieldByName('pic').Clear;
adoQ.FieldByName('pic').Assign(fbmp);
ADOQ.Post;
end;
end;
finally
fbmp.Free;
Fpicture.Free;
end;
if Openp.Execute then
begin
try
Fpicture := Tpicture.Create;
Fpicture.LoadFromFile(OPENP.FileName );
fbmp := TBitmap.Create;
if not (Fpicture.Graphic is Ticon) then
fbmp.Assign(Fpicture.Graphic)
else
begin
fbmp.Width := Fpicture.Icon.Width;
fbmp.Height := Fpicture.Icon.Height;
fbmp.Canvas.Draw(0, 0, Fpicture.Icon);
end;
case ADOQ.State of
DsInsert:
begin
adoQ.FieldByName('pic').Assign(fbmp);
adoQ.post;
end;
DsEdit:
begin
ADOQ.FieldByName('pic').Clear;
adoQ.FieldByName('pic').Assign(fbmp);
adoQ.post;
end;
dsBrowse:
begin
ADOQ.Edit;
ADOQ.FieldByName('pic').Clear;
adoQ.FieldByName('pic').Assign(fbmp);
ADOQ.Post;
end;
end;
finally
fbmp.Free;
Fpicture.Free;
end;
MSN:[email protected]
下面是为数据库添加二进制数据(IMAGE类型)的例子,以供参考:
var
MemStream: TMemoryStream;
begin
if OpenPictureDialog1.Execute then
begin
for I := 0 to OpenPictureDialog1.Files.Count - 1 do //添加文件
begin
MemStream := TMemoryStream.Create; //创建流
try
MemStream.LoadFromFile(OpenPictureDialog1.Files[I]); //将文件读到流中去
MemStream.Seek(0, soFromBeginning);
Compress(MemStream); //压缩文件
MemStream.Seek(0, soFromBeginning);
with ADOQuery2 do
begin
Append;
TBlobField(FieldByName('图片)).LoadFromStream(MemStream);
ADOQuery2.Post;
end;
finally
MemStream.Free;
end;
end;
end;