A
addie
Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.csdn.net/expert/topic/765/765494.xml?temp=.8706934
以前用Delphi4时写过一个能处理多种图片格式的DBImage组件。今天有个小软件需要用,就把它翻出来用了。本以为自己写的组件不该有任何问题,没想到一连上数据库就出错(Invalid type cast)。搞了半天才明白,原来是BlobStream使用不当造成的。
出错的代码如下:
var
Stream: TBlobStream;
begin
.....
Stream := TBlobStream.Create(BlobField, bmRead)
....
end;
原来TBlobStream是适用于TBDEDataSet,在ADO下应该用TADOBlobStream
我今天的程序用的是ADO,当然会报错了。
于是在Uses中加入ADODB单元,代码调整如下
var
Stream: TStream;
begin
.....
if BlobField.DataSet is TBDEDataSet then
Stream := TBlobStream.Create(BlobField, bmRead)
else
Stream := TADOBlobField.Create(BlobField, bmRead;
....
end;
这样改完后,一切正常。但心里却在范嘀吐,如果遇上其他类型的DataSet怎么办?比如TClientDataSet,TSQLDataSet,分别要求TClientBlobStream,TSQLBlobStream,难道要再几个else?再uses几个单元(组件体积岂不更大了)?以后再出其他类型的DataSet怎么办?Delphi这么棒的软件应该有通用的方式来处理BlobStream呀。
于是又看了看TBlobField的SaveToStream/LoadFromStream源码,嘿嘿,果然,Delphi没么笨,而是我功底不够。)
原来,Delphi早就考虑过我这种小儿科级的问题。TDataSet.CreateBlobStream,就是专门用来处理不同类型DataSet的BlobStream的。具体功能就不说了,同好们可以查帮助。
结论是:
Stream := BlobField.DataSet.CreateBlobStream(BlobField, bmRead);
这种方式最为安全,尤其是写组件时。
胡言乱语了许多,老板常在四周巡视,因此可能有许多语句不通顺,大家多谅解了。))
以前用Delphi4时写过一个能处理多种图片格式的DBImage组件。今天有个小软件需要用,就把它翻出来用了。本以为自己写的组件不该有任何问题,没想到一连上数据库就出错(Invalid type cast)。搞了半天才明白,原来是BlobStream使用不当造成的。
出错的代码如下:
var
Stream: TBlobStream;
begin
.....
Stream := TBlobStream.Create(BlobField, bmRead)
....
end;
原来TBlobStream是适用于TBDEDataSet,在ADO下应该用TADOBlobStream
我今天的程序用的是ADO,当然会报错了。
于是在Uses中加入ADODB单元,代码调整如下
var
Stream: TStream;
begin
.....
if BlobField.DataSet is TBDEDataSet then
Stream := TBlobStream.Create(BlobField, bmRead)
else
Stream := TADOBlobField.Create(BlobField, bmRead;
....
end;
这样改完后,一切正常。但心里却在范嘀吐,如果遇上其他类型的DataSet怎么办?比如TClientDataSet,TSQLDataSet,分别要求TClientBlobStream,TSQLBlobStream,难道要再几个else?再uses几个单元(组件体积岂不更大了)?以后再出其他类型的DataSet怎么办?Delphi这么棒的软件应该有通用的方式来处理BlobStream呀。
于是又看了看TBlobField的SaveToStream/LoadFromStream源码,嘿嘿,果然,Delphi没么笨,而是我功底不够。)
原来,Delphi早就考虑过我这种小儿科级的问题。TDataSet.CreateBlobStream,就是专门用来处理不同类型DataSet的BlobStream的。具体功能就不说了,同好们可以查帮助。
结论是:
Stream := BlobField.DataSet.CreateBlobStream(BlobField, bmRead);
这种方式最为安全,尤其是写组件时。
胡言乱语了许多,老板常在四周巡视,因此可能有许多语句不通顺,大家多谅解了。))