Blob字段读写问题(50分)

  • 主题发起人 whether_bobo
  • 开始时间
W

whether_bobo

Unregistered / Unconfirmed
GUEST, unregistred user!
////////////////////////////
Stream2 := TBlobStream.Create(Query1STREAMDATA, bmReadWrite);
try
...对stream2进行操作
query1.Post;
//在此读出就可以
TBlobField(query1.FieldByName('STREAMDATA')).SaveToFile('E:/aaa.txt');
finally
stream2.Free;
end;
//在此读出则出错 ‘Blob not open’?必须关闭query再打开就没问题了
TBlobField(query1.FieldByName('STREAMDATA')).SaveToFile('E:/aaa.txt');
//////////////////////////////
oracle 8i,delphi 6,BDE
数据库中若是字段定义为oracle的Blob字段类型,则不能对其进行CreateBlobStream操作
改成long raw就可以?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=844221
 
是不是因为流已经到最后了
 
和我的问题不同,我是在stream.free后再次使用该记录
显示‘BLOB NOT OPENED’
即使重新创建stream也无济于事
 
oracle里的Blob类型叫long raw(我是这么定义的,没有出错)
 
>数据库中若是字段定义为oracle的Blob字段类型,则不能对其进行CreateBlobStream操作
>改成long raw就可以?
当然了,因为BDE不支持oracle的Blob字段类型。oracle的Blob字段类型只提供给那些
它自身带的编程工具或者内部的存储过程可以使用,确切的说是ORACLE内部专用!
数据库类型也要看BDE或驱动程序是否支持的。oracle的字段类型多去了,而BDE只能
使用其中提供给BDE操作的部分。
 
显示BLOB字段的BMP图

(1)直接显示当前记录
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Assign(Table1Bitmap);
//Table1Bitmap为在Table中添加的字段
end;

(2)直接显示
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Assign(
TBLOBField(Table1.Fields[1]));
end;
//Image1.Picture.Bitmap.Assign(Table1.Fields[1]);也行

(3)不直接显示
procedure TForm1.Button2Click(Sender: TObject);
var
B: TBitmap;
begin
B := TBitmap.Create;
try
B.Assign(Table1Bitmap);
Image1.Picture.Bitmap.Assign(B);
finally
B.Free;
end;
end;



将BMP放入DBASE和Paradox的BLOB字段中

(1)使用裁剪板
procedure TForm1.Button1Click(Sender: TObject);
var
C: TClipboard;
begin
C := TClipboard.Create;
try
if Clipboard.HasFormat(CF_BITMAP) then
DBImage1.PasteFromClipboard
else
ShowMessage('Clipboard does not contain a bitmap!');
finally
C.Free;
end;
end;

(2)从文件调入
procedure TForm1.Button2Click(Sender: TObject);
begin
Table1Bitmap.LoadFromFile(
'c:/delphi/images/splash/16color/construc.bmp');
end;

(3)从其他控件的BITMAP类中读入
procedure TForm1.Button3Click(Sender: TObject);
var
B: TBitmap;
begin
B := TBitmap.Create;
try
B.LoadFromFile(
'c:/delphi/images/splash/16color/athena.bmp');
DBImage1.Picture.Assign(B);
finally
B.Free;
end;
end;

 
多谢贴了这么多代码,不过不是回答我的问题

有没有试过多次写入BLOB字段
query1.Append;
Stream := TBlobStream.Create(Query1STREAMDATA, bmReadWrite);
try
query1.FieldByName('ID').AsInteger:=1;
操作stream;
query1.Post;
except
stream.Free;
end;

query1.Append;
Stream := TBlobStream.Create(Query1STREAMDATA, bmReadWrite);
try
query1.FieldByName('ID').AsInteger:=1;
操作stream;
query1.Post;
except
stream.Free;
end;
这样就不可以,显示'BLOB NOT OPENED'
 
多次操作query时,要判断。
每次要用时都要判断一下。
if query1.active then query1.close;
 
问题解决,**** delphi的帮助制作人员
delphi help原文
=====================
The following example copies the data in the Notes field of Table1 to the Remarks field of ClientDataSet1.

procedure TForm1.Button1Click(Sender: TObject);

var
Stream1: TBlobStream;
Stream2: TStream;
begin
Stream1 := TBlobStream.Create(Table1Notes, bmRead);
try
ClientDataSet1.Edit;
{ here抯 a different way to create a blob stream }
Stream2 := ClientDataSet1.CreateBlobStream(ClientDataSet1.FieldByName('Remarks'), bmReadWrite);
try
Stream2.CopyFrom(Stream1, Stream1.Size);
******//问题就出在这
ClientDataSet1.Post;
finally
Stream2.Free;
/////放在这就好了,要先free,再post
//////ClientDataSet1.Post;
end;

finally
Stream1.Free;
end;
end;
=====================
 
多人接受答案了。
 
顶部