再问Oracle的Blob存取word问题,各位都怎么用比较好!我错在哪了?? (100分)

  • 主题发起人 主题发起人 coolmy
  • 开始时间 开始时间
C

coolmy

Unregistered / Unconfirmed
GUEST, unregistred user!
我搜了一下dfw,试了n次,才输学潜,不知自己错在哪了。
Var
Word_FileStream:TBlobStream;
Begin
Table1.Edit;
Word_FileStream:=TBlobStream.Create(Table1.FieldByName('useword') As TblobField,bmReadWrite);
OleContainer1.SaveToStream(Word_FileStream);
Word_FileStream.Free;
Table1.Post;
End;
另外又试了:
Word_FileStream:=TBlobStream.Create;
Olecontainer1.SaveToStream(Word_FileStream);
Word_FileStream.Position:=0;
With DM.ADOQuery1 do
Begin
Close;
Parameters.Clear;
SQL.Clear;
SQL.Add(' Update Table Set UseWord=:OraField Where Id=');
SQL.Add( AdoDataSet1.FieldByName('Id').AsString );
// Parameters.ParamByName('OraField').LoadFromStream(Word_FileStream,ftOraBlob);
Parameters.ParamByName('OraField').LoadFromStream(Word_FileStream,ftBlob);
ExecSQL;
Close;
End;
Word_FileStream.Free;
等均读出时Word 提示我要用什么编码打开它,打开时是乱码。可用PowerBuilder写进去的均正常打开,调用。
我又用了TMeMoryStream;TfileStream;Tstream;试了试,有些错误更多了。
我用的是:Win2000 server+oracle8.16+Delphi6+officexp,在98下同样如此。
不要告诉我再搜DFW了,有源码最好!
请各位大侠出手相救。!
 
你定义了: Word_FileStream:TBlobStream
怎么又: obBlobStream:=TBlobStream.Create(Table1.FieldByName('useword') As TblobField,bmReadWrite);
应该是: Word_FileStream :=TBlobStream.Create(Table1.FieldByName('useword') As TblobField,bmReadWrite);
吧.
 
To lob:
是我笔下误,打错了。我已修改了贴子,试的时候不是那样的。
 
呵赫!这个问题我遇到过,主要是因为OleContainer保存的时候在流的开头加一个
自己定义的文件头,而你读的时候是根据WROD的格式,所以是乱码!
解决办法是在保存的时候减去该文件头长度的字节数,具体减多少忘了,你只要看一下
他的方法就很清楚了,方法是在delphi中按ctrl再点OleContainer即可到
他声明的位置。
问题的关键在于你存的文件并不是原来的文件,已经经过了OleContainer的加工
在流的开头减去12个字节的长度然后保存,就可以跟原来的文档一样了
 
To only you:
为什么我用SQL,同样方法却没有问题,麻烦写一下代码。
 
1.BlobSize设置的大小合适(BDE设置)
2.文件流从开头减去12个字节
 
To only you:"文件流从开头减去12个字节"不好意思,给点提示代码!?翻书中。
 
To Only You:
搞不定,麻烦给一些提示代码!多谢了。
To All:
 大家都是怎么用的。 
 
感谢两位的热心参与,我用PowerBuilder做了。
若再有遇到该问题的同志,可用以下代码试试。
var
Stream : TMemoryStream;
FileStream : TFileStream;
begin
Stream := TMemoryStream.Create;
FileStream := TFileStream.Create('TEST.DOC', fmCreate) ;
with OleContainer1 do
if (State <> osEmpty) then
SaveToStream(Stream);
Stream.Seek(Sizeof(TStreamHeader), 0);
FileStream.CopyFrom(Stream, Stream.Size - SizeOf(TStreamHeader));
Stream.Free;
FileStream.Free;
end;
 
后退
顶部