Stream read error!Ole和Blob类型问题,在线等待,进着有分,不够再加 试试在LoadFromStream之前先把流定位到开头,我经常犯这样的错误。Memstream.Seek( 0, 0 ); 或Memstream.Position := 0; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用了下面的语句,可以了 MemStream:=ADOQ.CreateBlobStream(ADOQblobfld,bmRead); MemStream.Position:=0; viewOleWord.LoadFromStream(Memstream);但,多试几次就出问题了,Access violation at address 77A6... in module 'ole32.dll'. Read of address 00000000008.用一个过程:procedure TMainFrm.OleLoadFromBlobFld(Ole:TOleContainer;BlobFld:TBlobField);var BlobStream: TBlobStream; MemStream: TMemoryStream;begin MemStream:=TMemoryStream.Create; with ADOQ do begin BlobStream:=TBlobStream.Create(BlobFld, bmRead); try MemStream.CopyFrom(BlobStream,BlobStream.Size); Memstream.Position:=0; Ole.LoadFromStream(MemStream); finally BlobStream.Free; Memstream.Free; end; end;end;执行到 BlobStream:=TBlobStream.Create(BlobFld, bmRead);时又出现: Invalid class typecast 错误,请各位大侠帮我。 在李唯的书中用Ado存取Blob自段是这样写的。能在TOleContainer中显示,也能够把他从数据库中取出存为文件:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, OleCtnrs;type TForm1 = class(TForm) ADOConnection1: TADOConnection; ADODataSet1: TADODataSet; DBNavigator1: TDBNavigator; DBGrid1: TDBGrid; DataSource1: TDataSource; OpenDialog1: TOpenDialog; OleContainer1: TOleContainer; Button1: TButton; Button2: TButton; Button3: TButton; SaveDialog1: TSaveDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);//把Blob对象存入数库var sFileName:string; function BlobContentToString(const FileName:String):string; begin with TFileStream.Create(FileName,fmOpenRead) do try SetLength(Result,Size); Read(Pointer(Result)^,Size); finally Free; end; end;begin if (OpenDialog1.Execute) then begin sFileName:=OpenDialog1.FileName; AdoDataSet1.Append; AdoDataSet1.FieldByName('名称').AsString:=ExtractFileName(sFileName); AdoDataSet1.FieldByName('对象').AsString:=BlobContentToString(sFileName); AdoDataSet1.Post; end;end;procedure TForm1.Button2Click(Sender: TObject);//在TOleContainer中显示var sFileName:String; BS:TAdoBlobStream;begin BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead); try sFileName:=ExtractFilePath(Application.ExeName); sFileName:=sFileName+AdoDataSet1.FieldByName('名称').asstring; BS.SaveToFile(sFileName); OleContainer1.CleanupInstance ; OleContainer1.CreateObjectFromFile(sFileName,false); OleContainer1.DoVerb(0); finally BS.Free; end;end;procedure TForm1.Button3Click(Sender: TObject);//把Blob字段从数据库中导出存为文件,不过出错处理没有写好//就是当出现存储对话框后,按取消按扭的是怎么取消//存为文件没有写好,不好意思了var sFileName:String; BS:TAdoBlobStream;begin SaveDialog1.FileName:=AdoDataSet1.FieldByName('名称').asstring; if SaveDialog1.Execute then BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead); try sFileName:=SaveDialog1.FileName; //ShowMessage(sFileName); sFileName:=sFileName;//+AdoDataSet1.FieldByName('名称').asstring; BS.SaveToFile(sFileName); // OleContainer1.CleanupInstance ; //OleContainer1.CreateObjectFromFile(sFileName,false); //OleContainer1.DoVerb(0); finally BS.Free; end;//怎么判断存为按扭是确定还是取消end;end. 谢谢!我用的是ADO连接的,所以将 BlobStream:=TBlobStream.Create(BlobFld, bmRead);改为BlobStream:=TADOBlobStream.Create(BlobFld, bmRead);就好了。但还是不稳定,用一会儿就出现Access violation at address 77A6... in module 'ole32.dll'. Read of address 00....8 主要是我用了两个OleContainer,一个显示Word,另一个窗口里编辑,之间用了FirstOle.Copy;SecondOle.Paste;传递数据,大多数情况下好的,偶尔就 Access violation at address 7D3A6...45 in module 'ole32.dll'. Read of address 00D3....A8请高手们帮我解决。 cannot perform this operation on a closed dataset! 请问制作帮助的时候怎么实现自动跳转?见内容 数据库错误:连接已超时!!!!!! 小问题,20分钟后结帖 如何禁用窗体的“最大化”按钮? delphi7中tcpclient如何读出tcpserver发来的数据 请教!! ado 与sql server 2000的问题?急 数值比较一个奇怪的问题,why? 请问高手,如何显示Word内容? 简单问题,如何一个表中的字段不为空,且默认为指定值. 关于获取数组的元素个数问题!(都来看看)
MemStream:=ADOQ.CreateBlobStream(ADOQblobfld,bmRead);
MemStream.Position:=0;
viewOleWord.LoadFromStream(Memstream);
但,多试几次就出问题了,Access violation at address 77A6... in module 'ole32.dll'. Read of address 00000000008.
用一个过程:
procedure TMainFrm.OleLoadFromBlobFld(Ole:TOleContainer;BlobFld:TBlobField);
var
BlobStream: TBlobStream;
MemStream: TMemoryStream;
begin
MemStream:=TMemoryStream.Create;
with ADOQ do
begin
BlobStream:=TBlobStream.Create(BlobFld, bmRead);
try
MemStream.CopyFrom(BlobStream,BlobStream.Size);
Memstream.Position:=0;
Ole.LoadFromStream(MemStream);
finally
BlobStream.Free;
Memstream.Free;
end;
end;
end;
执行到 BlobStream:=TBlobStream.Create(BlobFld, bmRead);
时又出现: Invalid class typecast 错误,请各位大侠帮我。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, OleCtnrs;type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
OpenDialog1: TOpenDialog;
OleContainer1: TOleContainer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);//把Blob对象存入数库
var
sFileName:string;
function BlobContentToString(const FileName:String):string;
begin
with TFileStream.Create(FileName,fmOpenRead) do
try
SetLength(Result,Size);
Read(Pointer(Result)^,Size);
finally
Free;
end;
end;
begin
if (OpenDialog1.Execute) then
begin
sFileName:=OpenDialog1.FileName;
AdoDataSet1.Append;
AdoDataSet1.FieldByName('名称').AsString:=ExtractFileName(sFileName);
AdoDataSet1.FieldByName('对象').AsString:=BlobContentToString(sFileName);
AdoDataSet1.Post;
end;end;procedure TForm1.Button2Click(Sender: TObject);
//在TOleContainer中显示
var
sFileName:String;
BS:TAdoBlobStream;
begin
BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead);
try
sFileName:=ExtractFilePath(Application.ExeName);
sFileName:=sFileName+AdoDataSet1.FieldByName('名称').asstring;
BS.SaveToFile(sFileName);
OleContainer1.CleanupInstance ;
OleContainer1.CreateObjectFromFile(sFileName,false);
OleContainer1.DoVerb(0);
finally
BS.Free;
end;end;procedure TForm1.Button3Click(Sender: TObject);
//把Blob字段从数据库中导出存为文件,不过出错处理没有写好
//就是当出现存储对话框后,按取消按扭的是怎么取消
//存为文件没有写好,不好意思了
var
sFileName:String;
BS:TAdoBlobStream;
begin
SaveDialog1.FileName:=AdoDataSet1.FieldByName('名称').asstring;
if SaveDialog1.Execute then BS:=TadoBlobStream.Create(TBlobField(AdodataSet1.FieldByName('对象')),bmRead);
try
sFileName:=SaveDialog1.FileName;
//ShowMessage(sFileName);
sFileName:=sFileName;//+AdoDataSet1.FieldByName('名称').asstring;
BS.SaveToFile(sFileName);
// OleContainer1.CleanupInstance ;
//OleContainer1.CreateObjectFromFile(sFileName,false);
//OleContainer1.DoVerb(0);
finally
BS.Free;
end;//怎么判断存为按扭是确定还是取消end;end.
BlobStream:=TBlobStream.Create(BlobFld, bmRead);
改为
BlobStream:=TADOBlobStream.Create(BlobFld, bmRead);
就好了。
但还是不稳定,用一会儿就出现
Access violation at address 77A6... in module 'ole32.dll'. Read of address 00....8
FirstOle.Copy;
SecondOle.Paste;
传递数据,大多数情况下好的,偶尔就 Access violation at address 7D3A6...45 in module 'ole32.dll'. Read of address 00D3....A8
请高手们帮我解决。