读、写TblobField(老问题!)(40分)

  • 主题发起人 主题发起人 Jams
  • 开始时间 开始时间
J

Jams

Unregistered / Unconfirmed
GUEST, unregistred user!
本人有如下程序,目的是实现:
Ole ===> Stream ===> TBlobField
和 TBlobField ===> Stream ===> Ole
已知:已建立了数据库表,且各字段固定,并用字段编辑器建立了永久字段,
问各路高手,如何改写程序部分以期实现上述目的,最好能够将每一步或语句
说明其目的和作用,越详细越好,多谢!!!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, StdCtrls, OleCtnrs, DBCtrls, Grids, DBGrids, DBTables, ExtCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
OleContainer1: TOleContainer;
Table1IntegerField: TIntegerField;
Table1StringField: TStringField;
Table1StringField2: TStringField;
Table1StringField3: TStringField;
Table1StringField4: TStringField;
Table1StringField5: TStringField;
Table1BlobField: TBlobField;
Table1StringField6: TStringField;
Table1StringField7: TStringField;
Table1FloatField: TFloatField;
Table1BlobField2: TBlobField;
Table1BooleanField: TBooleanField;
Table1GraphicField: TGraphicField;
OleContainer2: TOleContainer;
OkBtn: TButton;
ClosBtn: TButton;
procedure OkBtnClick(Sender: TObject);
procedure ClosBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
BlobStream: TBlobStream;
OleStream: TMemoryStream;

implementation

{$R *.DFM}


procedure TForm1.OkBtnClick(Sender: TObject);
Var
i: Integer;
begin
OleStream := TMemoryStream.Create;
BlobStream := TBlobStream.Create(TBlobField(Table1.Fields[6]),
bmRead); {*使用bmWrite、bmReadWrite, Delphi报错
不知何故?*}
With Table1 do
Begin
DisableControls;
Active := True;
Open;
Edit;
First;
i := 0;
While i<=1 Do {*仅使用一条记录*}
Begin
OleContainer1.SaveToStream(OleStream); {*Ole ---> TMemoryStream*}
TBlobField(FieldByname('题目内容')).LoadFromStream(OleStream);
{*将Ole的数据填入字段*}
post;
Inc(i);
Next;
end;
Close;

Open;
i := 0;
While i<=1 Do
Begin
TBlobField(FieldByname('题目内容')).SaveToStream(OleStream);
{*取字段的内容,以验证写入的正确性*}
OleContainer2.LoadFromStream(Olestream);
{*将字段填入Ole中*}
Inc(i);
Next;
end;
Close;
EnableControls;
end;
BlobStream.Free;
OleStream.Free;
end;

procedure TForm1.ClosBtnClick(Sender: TObject);
begin
Close;
end;

end.
 
用Table1GraphicField.
 
如何运作列出算法!
 
提供以下例程,仅供参考:

unit blobFun;
////////////////////////////////////////////////////////////////////
//有关blob字段的读写操作公共函数
////////////////////////////////////////////////////////////////////
interface
uses classes,db,dbtables,graphics;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:IMAGE字段的读写操作
function gfWriteDataToBlobField(bIndex,eIndex:integer;data:array of double;var fieldObject:TBlobField):boolean;
function gfReadDataFromBlobField(bIndex,eIndex:integer;var data:array of double;fieldObject:TBlobField):boolean;

function gfWriteImageToBlobField(bitmapObject:TBitmap;var fieldObject:TBlobField):boolean;
function gfReadImageFromBlobField(var bitmapObject:TBitmap;fieldObject:TBlobField):boolean;

implementation

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到数组中
//输入: data:实型数组 bIndex,eIndex:数组起止索引 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:fieldObject对象数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfWriteDataToBlobField(bIndex,eIndex:integer;data:array of double;var fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
begin
//check parameters:
// Assert((data<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');
Assert(eIndex>=bIndex,'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(double)*(eIndex-bIndex);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);
//write data into memory stream
dataStream.Write(data,bufferlen);
//write data into field object from memory stream
try
fieldObject.LoadFromStream(dataStream);
except
Result:=False;
end;


dataStream.free;
end;



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到数组中
//输入: data:实型数组 bIndex,eIndex:数组起止索引 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:data数组中数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfReadDataFromBlobField(bIndex,eIndex:integer;var data:array of double;fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
myBlobStream:TBlobStream;
begin
//check parameters:
// Assert((data<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');
Assert(eIndex>=bIndex,'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(double)*(eIndex-bIndex);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);

try
begin
//make blob stream
myBlobStream:=TBlobStream.Create(fieldObject,bmRead);

//read data from blob stream to memory stream
dataStream.LoadFromStream(myBlobStream);
end
except
begin
Result:=false;
end
end;

//read data into data array from memory stream
if Result then dataStream.Read(data[bIndex],bufferlen);
dataStream.Free;
end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到image对象中
//输入: bitmapObject:图形对象 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:fieldObject数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfWriteImageToBlobField(bitmapObject:TBitmap;var fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
begin
//check parameters:
Assert(((bitmapObject<>nil) AND (fieldObject<>nil)),'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(bitmapObject);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);
//write data into memory stream
bitmapObject.SaveToStream(dataStream);

//write data into field object from memory stream
try
fieldObject.LoadFromStream(dataStream);
except
Result:=False;
end;


dataStream.free;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到image对象中
//输入: bitmapObject:图形对象 fieldObject:与IMAGE字段对应的fieldObject对象
//输出: bitmapObject数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfReadImageFromBlobField(var bitmapObject:TBitmap;fieldObject:TBlobField):boolean;
var
myBlobStream:TBlobStream;
begin
//check parameters:
Assert((bitmapObject<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
try
begin
//make blob stream
myBlobStream:=TBlobStream.Create(fieldObject,bmRead);

//read data from blob stream to memory stream
bitmapObject.LoadFromStream(myBlobStream);
end
except
begin
Result:=false;
end
end;

//read data into data array from memory stream
myBlobStream.Free;
end;
end.
 
谁还有不同政见者,准备结束该问题:
预计:last_hero: 30
zhaoyipeng: 10
 
JAMES:
我也要实现:
Ole ===> Stream ===> TBlobField
和 TBlobField ===> Stream ===> Ole
我是要将EXCEL文件存入数据库和读出来显示到OLECONTAINER中。
我看了一下你的关于此类问题的讨论,看了一遍,还是不太明白。
你能否给我一个简单明了的解法:
我现在是这样做的:
1、读
数据库 ===> TBlobField ===> Excel文件 ===>OLECONTAINER
2、写
OLECONTAINER===> EXCEL文件 ===> TBlobField ===>数据库
我这里的EXCEL文件是个临时文件,过渡性的,没有用,
本来我看到你的文章,以为可以省略这个步骤,但是看来看去,
我这里的寥寥无几的语句,到这里怎么就这么繁了,看不懂了?
你能不能给我一个能省略掉EXCEL临时文件的简单明了的解决办法?
 
olecontainer.loadfromstream(stream),这个stream用的格式和普通的
TFilestream,tblobstream格式不一致,需要在tblobstream或tfilestream
前加一段内容,才能load(见姚庭宝的书)
 
To 1Lts

1.读
stream:Tblobstream;

stream:=Tblobstream.Create(blob字段,bmread);
Olecontainer1.LoandFromStream(stream);
stream.free;
2.写
Stream:Tmemorystream;

stream:=Tmemorystream.create;
Olecontainer1.SaveToStream(stream);
Blob字段.Loadfromstream(stream);
stream.free;
 
1lts说的没错
stream和blobstream在这个loadfromstream中是不一致的
会报错

但应该将方法公布给大家方显大侠本色
而不是去查什么摸不到的鬼书
 
多人接受答案了。
 
我怎么就扩搞不定这个问题呢?请各位看看有什么错?
问题1 :
我在delphi5中用以下这段程序将ORACLE7.3的LONG型字段读到一个OleContainer容器中,
说明:1,2: 我分别用1、2去读BLOB字段,但总是在语句3处出现 "%1已经存在" 的出错提示。

procedure TFormlist.BtnFetchBlobFldClick(Sender: TObject);
var
OleStream : TStream;
begin
OleStream := TMemoryStream.Create;

try

1: (tbKblist.FieldByName('BLOBfield') as TBlobField).SaveToStream(OleStream);
2: OleStream := tbKblist.CreateBlobStream(tbKblist.FieldByName('blobfield')
as tblobField, bmRead);
OleStream.Position := 0;

if (OleCtnerKbsm.State = osEmpty) or
(MessageDlg('Delete current OLE object?', mtConfirmation, mbOkCancel, 0) = mrOk) then begin
OleCtnerKbsm.LoadFromStream(OleStream);
3: OleCtnerKbsm.DoVerb(0); //显示
end;

finally
OleStream.Free;
end;
end;

下面这段程序是将一个OleContainer容器中的东西存到ORACLE7.3的LONG型字段中,没有什么出错信息。
procedure TFormlist.BtnSaveBlobFldClick(Sender: TObject);
var
OleStream : TMemoryStream;
begin
OleStream := TMemoryStream.Create;
try
OleCtnerKbsm.SaveToStream(OleStream);

OleStream.Position := 0; //回零点
tbKblist.edit;
(tbKblist.FieldByName('blobfield') as TBlobField).LoadFromStream(OleStream);
tbKblist.Post ;
finally
OleStream.Free;
end;
end;

问题2 :
为什么oracle 7.3中LONG型字段,在delphi5中被认为是 ftMemofield, 而不是 ftBlobfield?

 
to yvping:
我也正在搜索这个答案,不过还没找到!你解决了吗?如果解决,请说一声!谢谢
 
姚庭宝的书是什么书?

TBlobStream和olecontainer1.loadfromstream(Stream)的Stream
在格式上有何区别!

我迫切想知道!
 
后退
顶部