读Blob
///////////
var
st:TMemoryStream;
tbd:TBlobField;
begin
st:=TMemoryStream.create;
try
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from tb1 where id=1');
try
adoquery1.open;
st.Position :=0;
tbd:=TBlobField(adoquery1.FieldByName('binarydata'));
tbd.SaveToStream(st); ///////执行这句报错(Invalid class typecase)
except
statusbar1.Panels.items[0].Text :='执行SQL出错.';
end;
finally
st.Free;
end;
end;请问是怎回事,怎么解决?
///////////
var
st:TMemoryStream;
tbd:TBlobField;
begin
st:=TMemoryStream.create;
try
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from tb1 where id=1');
try
adoquery1.open;
st.Position :=0;
tbd:=TBlobField(adoquery1.FieldByName('binarydata'));
tbd.SaveToStream(st); ///////执行这句报错(Invalid class typecase)
except
statusbar1.Panels.items[0].Text :='执行SQL出错.';
end;
finally
st.Free;
end;
end;请问是怎回事,怎么解决?
解决方案 »
- 如何像鼠标单击任务栏程序一样,激活并显示程序界面?
- delphibox盒子还会开吗?思念啊..一起成长的!为什么要关掉啊....
- 超难的点阵汉字转换
- 请教一个类型定义
- 重分酬谢!关于delphi中acess数据库的导入,导出问题!
- 请问FastReport2.5的报表设计器可否设计主从表性质的报表,注意数据集不是在程序中设定,而是对话框中设定。
- 我用cxtextedit为什么没有passchar ***??
- 咨询
- 关于播放器的初级问题
- zswang(伴水)(被黑中) 请进,老问题,你的答案不行阿!一个被调用窗体怎么在create过程中就关掉它呢?同时又如何在create前传入参数给它?
- 在调用窗体类时如何实现类的构造
- 发展前途问题。我该如何作出决定
如何处理BLOB字段,可以借鉴一些可视的桌面数据库的方法。如Access中,BLOB字段是可以通过双击该字段的方式打开。Access是通过OLE的方式实现BLOB数据的编辑及处理的,所以我们也可以在通过程序中设置OLE控件的方法来处理BLOB。下面,我们先讨论操作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;
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.
---找了一个例子,不知道是不是管用!嘻!希望主保佑你,你会解决这个BUG的!