高手请进,如何将一个二进制文件中的内容写到数据库表中的某个字段! 本人有一批二进制文件,文件长度超过60K,需要写到数据库表中的某个字段,请问高手如何操作,最好有实例! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用BLOB字段来吧!操作BLOB的关键要在程序中自如地操作BLOB数据,无非是解决以下几个问题:1. BLOB数据的入库操作2. BLOB数据的显示3. BLOB数据的编辑、修改 由于数据的类型可能千变万化,所以,采用OLE方式是较方便的选择。我们可以在程序中放置一个OLE控件,用于显示、编辑各种BLOB数据。那么,问题的关键就是BLOB数据如何入库,以及数据库如何与OLE控件之间传递数据。第一种解决方案是在库中直接保存原始数据。具体方法如下: BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:AblobField.LoadFromfile(aFileName); 数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:AblobField.SaveToFile(aFileName);AOleContainer.CreateObjectFromFile(aFileName);注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不? E格式,是不能直接读取的。直接读取将导致运行错误。 第二种方案是在库中以OLE格式保存数据。具体方法如下: 本方案的不同之处,在于数据入库前先进行格式的转换。格式的转换是通过OLE控件完成的。即,先创建OLE对象,然后入库。示例代码如下:AOleContainer.CreateObjectFromFile(aFileName);AoleContainer.SaveToFile(tmpFileName);AblobField.LoadFromfile(tmpFileName); 这样作的好处是,由于库中直接存储的是OLE格式,所以,在库与OLE控件之间的数据传递将非常方便。在这种情况下,可以通过文件直接传递:数据字段先将数据存到一个临时文件中,然后,OLE控件从临时文件中读取。即:AblobField.SaveToFile(aFileName);AOleContainer.LoadFromFile(aFileName);另外,还可以通过内存流来完成。使用内存流,可减少磁盘操作,大大提高运行效率。即:AblobField.SaveToStream(aStream);AOleContainer.LoadFromStream(aStream);下面是一个简单的例子。一个简单的例子 本例中,采用Paradox数据库。库中有两个字段,一个是字符型,另一个是BLOB型。我们在主Form上放一个OLE控件用于编辑及转换数据。一个Table控件操作数据库。源代码如下:unit blob01;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, Db, DBCtrls, OleCtnrs, DBTables, ExtCtrls;type TForm1 = class(TForm) Panel1: TPanel; Panel2: TPanel; Splitter1: TSplitter; Panel3: TPanel; Table1: TTable; OleContainer1: TOleContainer; DBNavigator1: TDBNavigator; DataSource1: TDataSource; DBGrid1: TDBGrid; OpenBtn: TButton; CloseBtn: TButton; OpenDialog1: TOpenDialog; LoadBtn: TButton; Table1Filename: TStringField; Table1ABlob: TBlobField; procedure OpenBtnClick(Sender: TObject); procedure CloseBtnClick(Sender: TObject); procedure LoadBtnClick(Sender: TObject); procedure Table1AfterScroll(DataSet: TDataSet);private { Private declarations }public { Public declarations }end; var Form1: TForm1;implementation{$R *.DFM}procedure TForm1.OpenBtnClick(Sender: TObject);begin Table1.Open; //打开数据库end;procedure TForm1.CloseBtnClick(Sender: TObject);begin Table1.Close; //关闭数据库end;//打开一个数据文件、创建OLE对象、将对象数据存入数据库procedure TForm1.LoadBtnClick(Sender: TObject);varfn: string;begin if OpenDialog1.Execute then begin //打开文件 fn := ExtractFileName(OpenDialog1.FileName); Table1FileName.AsString := fn; OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False); //创建OLE对象 OleContainer1.SaveToFile("tmp"); //将OLE数据存入临时文件 Table1ABlob.LoadFromFile("tmp"); //将OLE数据存入数据库 end;end;//定义此方法用于显示当前记录中的OLE对象procedure TForm1.Table1AfterScroll(DataSet: TDataSet);begin if not Table1ABlob.IsNull then begin Table1ABlob.SaveToFile("tmp"); //数据存入临时文件 OleContainer1.LoadFromFile("tmp"); //从临时文件中读取OLE对象 end;end;end. Delphi面试题 问个简单问题!请帮忙 鞋业的有关尺寸与颜色的处理方式 “动态连接库高手”和“串口通讯高手”帮忙————————在线等待!!!!!!????????? 这段代码有什么问题,郁闷! 简单问题请大家帮忙,在线等呀!急!晚了就没了! 我想改变PAGECONTROL得标题条上的字体该怎么办? 关于TreeNode.data初始化的问题? 呵呵,我发现一个csdn问题,不知道大家是否注意到了。 奇怪问题请教,急! 为什么用代理上MSN messenger老是掉线,而且断了之后会自动连接 关于文件的问题
操作BLOB的关键
要在程序中自如地操作BLOB数据,无非是解决以下几个问题:
1. BLOB数据的入库操作
2. BLOB数据的显示
3. BLOB数据的编辑、修改
由于数据的类型可能千变万化,所以,采用OLE方式是较方便的选择。我们可以在程序中放置一个OLE控件,用于显示、编辑各种BLOB数据。那么,问题的关键就是BLOB数据如何入库,以及数据库如何与OLE控件之间传递数据。
第一种解决方案是在库中直接保存原始数据。具体方法如下:
BLOB数据的入库:要把BLOB数据入库,不能向普通的数据那样直接赋值;而是利用BLOB字段的LoadFromfile方法。采用这个方法,可以直接将各种数据的数据文件存入数据库。代码如下:
AblobField.LoadFromfile(aFileName);
数据库与OLE控件间的数据传递也要通过数据文件。即,BLOB字段先将数据存盘;然后,OLE从将数据文件中创建所需要的OLE对象。代码如下:
AblobField.SaveToFile(aFileName);
AOleContainer.CreateObjectFromFile(aFileName);
注意:OLE对象不能直接使用LoadFromFile方法,因为,数据库中存放的BLOB对象的格式是文件原来的格式,而不? E格式,是不能直接读取的。直接读取将导致运行错误。 第二种方案是在库中以OLE格式保存数据。具体方法如下:
本方案的不同之处,在于数据入库前先进行格式的转换。格式的转换是通过OLE控件完成的。即,先创建OLE对象,然后入库。示例代码如下:
AOleContainer.CreateObjectFromFile(aFileName);
AoleContainer.SaveToFile(tmpFileName);
AblobField.LoadFromfile(tmpFileName);
这样作的好处是,由于库中直接存储的是OLE格式,所以,在库与OLE控件之间的数据传递将非常方便。在这种情况下,可以通过文件直接传递:数据字段先将数据存到一个临时文件中,然后,OLE控件从临时文件中读取。即:
AblobField.SaveToFile(aFileName);
AOleContainer.LoadFromFile(aFileName);
另外,还可以通过内存流来完成。使用内存流,可减少磁盘操作,大大提高运行效率。即:
AblobField.SaveToStream(aStream);
AOleContainer.LoadFromStream(aStream);
下面是一个简单的例子。一个简单的例子
本例中,采用Paradox数据库。库中有两个字段,一个是字符型,另一个是BLOB型。我们在主Form上放一个OLE控件用于编辑及转换数据。一个Table控件操作数据库。源代码如下:
unit blob01;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBCtrls, OleCtnrs, DBTables, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Splitter1: TSplitter;
Panel3: TPanel;
Table1: TTable;
OleContainer1: TOleContainer;
DBNavigator1: TDBNavigator;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
OpenBtn: TButton;
CloseBtn: TButton;
OpenDialog1: TOpenDialog;
LoadBtn: TButton;
Table1Filename: TStringField;
Table1ABlob: TBlobField;
procedure OpenBtnClick(Sender: TObject);
procedure CloseBtnClick(Sender: TObject);
procedure LoadBtnClick(Sender: TObject);
procedure Table1AfterScroll(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.OpenBtnClick(Sender: TObject);
begin
Table1.Open; //打开数据库
end;procedure TForm1.CloseBtnClick(Sender: TObject);
begin
Table1.Close; //关闭数据库
end;//打开一个数据文件、创建OLE对象、将对象数据存入数据库
procedure TForm1.LoadBtnClick(Sender: TObject);
var
fn: string;
begin
if OpenDialog1.Execute then begin //打开文件
fn := ExtractFileName(OpenDialog1.FileName);
Table1FileName.AsString := fn;
OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, False); //创建OLE对象
OleContainer1.SaveToFile("tmp"); //将OLE数据存入临时文件
Table1ABlob.LoadFromFile("tmp"); //将OLE数据存入数据库
end;
end;//定义此方法用于显示当前记录中的OLE对象
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
if not Table1ABlob.IsNull then begin
Table1ABlob.SaveToFile("tmp"); //数据存入临时文件
OleContainer1.LoadFromFile("tmp"); //从临时文件中读取OLE对象
end;
end;end.