Stream read error!Ole和Blob类型问题,在线等待,进着有分,不够再加

ychyzr 2002-07-21 10:35:36
我用Ole格式将Word文档保存在Sql Server 2000的Image类型字段中,入库时这样:
OleContainer.SaveToStream(Memstream);
blobField.LoadFromStream(Memstream);
没有出错,显示时我的语句是:
blobField.SaveToStream(Memstream);
OleContainer.LoadFromStream(Memstream);
出错,说 Stream read error 。请问如何解决?
我用Word原格式以文件做中介是成功的。
...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ychyzr 2002-08-02
  • 打赏
  • 举报
回复
关注,UP!
光明山人 2002-07-22
  • 打赏
  • 举报
回复
试试在LoadFromStream之前先把流定位到开头,我经常犯这样的错误。
Memstream.Seek( 0, 0 ); 或
Memstream.Position := 0;
greencoding 2002-07-22
  • 打赏
  • 举报
回复
我也帮你UP一下
ychyzr 2002-07-22
  • 打赏
  • 举报
回复
主要是我用了两个OleContainer,一个显示Word,另一个窗口里编辑,之间用了
FirstOle.Copy;
SecondOle.Paste;
传递数据,大多数情况下好的,偶尔就 Access violation at address 7D3A6...45 in module 'ole32.dll'. Read of address 00D3....A8
请高手们帮我解决。
ychyzr 2002-07-22
  • 打赏
  • 举报
回复
谢谢!我用的是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
hezchuan168 2002-07-22
  • 打赏
  • 举报
回复
我想也是这样的,我也遇到过这种问题呢?
LMale 2002-07-22
  • 打赏
  • 举报
回复
在李唯的书中用Ado存取Blob自段是这样写的。能在TOleContainer中显示,也能够把他从数据库中取出存为文件:
unit Unit1;

interface

uses
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.
ychyzr 2002-07-22
  • 打赏
  • 举报
回复
我用了下面的语句,可以了
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 错误,请各位大侠帮我。

silvermoon 2002-07-21
  • 打赏
  • 举报
回复
先帮你UP一下。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧