有朋友初學編程,嚐試自己做一個簡單的人事系統,昨天問到我如果在程序中實現對相片的讀、寫操作。這個問題我以前也有做過,但時間隔得久,只記得個大概,於是又動手研究了一下,並用內存流的方式予以實現,相對於網上其它實現方法的冗長、複雜而言,此方法既簡單又高效。
我們知道BLOB在数据库的表中实际上是以二进制数据的形式存放的。由于BLOB的特殊性,一般的程序都无法处理它。比如,如果在一张表中存在BLOB,当用數據顯示控件打开它时,BLOB列将只显示BLOB字样。至于该列中实际存的是什么数据是一般的數據顯示控件无法知到的。如果在我们编制的程序中,用DBGrid控件打开一个有BLOB字段的表,效果也一样。我们的程序无法直接显示、编辑以及插入BLOB字段。可见,常规的方法是不能满足要求的。
既然我們知道數據以二進制形式存放,那麼就可以通过内存流来完成。使用内存流,可减少磁盘操作,從而大大提高运行效率。程序的實現代碼如下(以Delphi為例進行說明):
以上的例子只是說明圖片的讀寫操作過程,當然,只要小小的改動,就可以變為讀寫任意的Blob類型。
網上的內容太豐富,如有雷同,純屬巧合!
文章出处: http://www.cnblogs.com Bonny.Wong(让思想飞翔) 於2005.1.25日
我們知道BLOB在数据库的表中实际上是以二进制数据的形式存放的。由于BLOB的特殊性,一般的程序都无法处理它。比如,如果在一张表中存在BLOB,当用數據顯示控件打开它时,BLOB列将只显示BLOB字样。至于该列中实际存的是什么数据是一般的數據顯示控件无法知到的。如果在我们编制的程序中,用DBGrid控件打开一个有BLOB字段的表,效果也一样。我们的程序无法直接显示、编辑以及插入BLOB字段。可见,常规的方法是不能满足要求的。
既然我們知道數據以二進制形式存放,那麼就可以通过内存流来完成。使用内存流,可减少磁盘操作,從而大大提高运行效率。程序的實現代碼如下(以Delphi為例進行說明):
procedure TForm1.Button1Click(Sender: TObject);
//
插入圖片過程
var
testStream:TMemoryStream;
begin
try
testStream : = TMemoryStream.Create; // 創建內存流
Image1.Picture.Graphic.SaveToStream(testStream); // 將圖片保存至內存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add( ' Insert into test (id,photo) values (:id,:photo) ' ); // 進行插入操作
adoquery1.Parameters.ParamByName( ' id ' ).Value : = ' 003 ' ;
adoQuery1.Parameters.ParamByName( ' photo ' ).LoadFromStream(testStream,ftBlob); // 讀取保存的內存圖
adoquery1.ExecSQL;
finally
testStream.Free; // 釋放內存流
end;
end;
procedure TForm1.Button2Click(Sender: TObject); // 讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName( ' photo ' ).IsNull then begin ;
mStream: = TMemoryStream.Create ;
JpgFile: = TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName( ' photo ' )).SaveToStream(mStream); // 顯示的轉換為BlobFiled並保存至內存流
mStream.Position : = 0 ;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture : = nil;
end;
end;
var
testStream:TMemoryStream;
begin
try
testStream : = TMemoryStream.Create; // 創建內存流
Image1.Picture.Graphic.SaveToStream(testStream); // 將圖片保存至內存流中
adoquery1.Close;
adoquery1.SQL.Clear;
adoQuery1.SQL.Add( ' Insert into test (id,photo) values (:id,:photo) ' ); // 進行插入操作
adoquery1.Parameters.ParamByName( ' id ' ).Value : = ' 003 ' ;
adoQuery1.Parameters.ParamByName( ' photo ' ).LoadFromStream(testStream,ftBlob); // 讀取保存的內存圖
adoquery1.ExecSQL;
finally
testStream.Free; // 釋放內存流
end;
end;
procedure TForm1.Button2Click(Sender: TObject); // 讀取圖片過程
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
if not ADOQuery1.FieldByName( ' photo ' ).IsNull then begin ;
mStream: = TMemoryStream.Create ;
JpgFile: = TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName( ' photo ' )).SaveToStream(mStream); // 顯示的轉換為BlobFiled並保存至內存流
mStream.Position : = 0 ;
jpgfile.LoadFromStream(MStream);
image2.Picture.Assign(JpgFile);
end
else begin
image2.Picture : = nil;
end;
end;
以上的例子只是說明圖片的讀寫操作過程,當然,只要小小的改動,就可以變為讀寫任意的Blob類型。
網上的內容太豐富,如有雷同,純屬巧合!
文章出处: http://www.cnblogs.com Bonny.Wong(让思想飞翔) 於2005.1.25日