用 ADO 对 Oracle blob 字段读写
有谁用过 ADO 对ORACLE BLOB字段读写 有谁做过请指教
急!!!
问题点数:280、回复次数:16Top
1 楼telstar(小李大刀)回复于 2001-11-13 18:25:11 得分 10
关注Top
2 楼zzy4486(世界)回复于 2001-11-13 18:31:29 得分 0
我用TADOBLOBSTREAM 对 BLOB 字段操作 好象是写进表里了 可是请不出来
用TBLOBFIELD也是一样
有知是哪的问题
我在外地出差
搞不定就没办法回去, 请各位高手快帮帮忙!!!!!Top
3 楼cobi(我是小新)回复于 2001-11-13 20:04:37 得分 10
看以下的代码能否帮助你,query和adoquery在很多地方都是相似的。
procedure TForm1.Button3Click(Sender: TObject);
var
Buffer: PChar;
MemSize: Integer;
Stream: TBlobStream;
begin
with query1 do
begin
Close;
Sql.Clear;
Sql.Add('select * from FingerData where ID=3 ');
Open;
IF RecordCount=0 then
begin
Showmessage('No Data ');
Exit;
end;
end;
Stream := TBlobStream.Create(query1.FieldByName('Fingers') as TBlobField, bmRead);
try
MemSize := Stream.Size;
Inc(MemSize);
Buffer := AllocMem(MemSize);
try
Stream.Read(Buffer^, MemSize);
Memo1.SetTextBuf(Buffer);
finally
FreeMem(Buffer, MemSize);
end;
finally
Stream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Stream: TBlobStream;
S: string;
begin
with Table1 do
begin
Open;
insert;
FieldByName('ID').AsInteger:=3;
Stream :=TBlobStream.Create(TBlobField(FieldByName('Fingers')),bmReadWrite );
try
Stream.Seek(0, 2);
S := 'My Blob Stream Data';
Stream.Write(pchar(S)^, Length(S));
finally
Stream.Free;
end;
Post;
end;
end;Top
4 楼xBai21(小新)回复于 2001-11-14 00:42:20 得分 10
如果作为永久字段可以用 savetofile方法Top
5 楼zzy4486(世界)回复于 2001-11-14 11:33:12 得分 0
永久字段是在建表的时候设的吗
如何设???Top
6 楼xBai21(小新)回复于 2001-11-15 17:23:59 得分 10
设计界面中
adotable 在tablename 属性设置正确的时候
adoquery 在sql 属性为返回视图时候
你只要把 鼠标移动到 控件上按右键 选择add all field 就可以
生成的永久字段名称应该是 adotable字段名(控件名为 adotable)
adoquery字段名(控件名为 adoquery)
Top
7 楼zzy4486(世界)回复于 2001-11-18 18:00:56 得分 0
不成
各种方法我都试过了,现在问题是用ADO可以写BLOB
可读时为空(用TBlobField 和 TADOBlobStream 等等结果都是一样
用BDE可以读出,为什么用ADO就是不行Top
8 楼galeboy(狂风)回复于 2001-11-18 18:13:24 得分 20
这是我的贴子,有人知道原因吗Top
9 楼cobi(我是小新)回复于 2001-11-18 19:28:01 得分 20
你现在的重要问题在那里?Top
10 楼galeboy(狂风)回复于 2001-11-19 11:25:29 得分 20
就是读不出来,
已经写进去了,因为用BDE可以读出来,可用ADO却不行
Top
11 楼cobi(我是小新)回复于 2001-11-20 16:00:34 得分 20
var BS ;TadoBlobstream;
BS := TADOBlobstream.create(TBlobField(adodataset1.fieldbyname('blobs')),bmread);
bs.savetofile(filename);
这样做可以吗?我用的是一个adodataset组件,用commandtext取回数据。
Top
12 楼ruisheng(咳咳)回复于 2001-11-20 16:25:58 得分 20
/////////读/////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
Stream1: TADOBlobStream;
sql1: string;
begin
DM.ADOQuery1.Close;
DM.ADOQuery1.SQL.Clear;
sql1 := 'select * from gzrr';
DM.ADOQuery1.SQL.Add(sql1);
DM.ADOQuery1.Open;
DM.ADOQuery1.Last;
DM.ADOQuery1.INsert;
try
stream1 := TADOBlobStream.Create(DM.ADOQuery1.FieldByName('RR')as TBlobField,bmReadWrite);
stream1.LoadFromFile('C:\My Documents\aaa.doc');
DM.ADOQuery1.FieldByName('gzs_gzbh').AsString := '123';
DM.ADOQuery1.FieldByName('gzs_flno').AsString := '1232121212';
RichEdit1.Lines.SaveToStream(stream1);
finally
stream1.Free;
end;
DM.ADOQuery1.post;
end;
///////////写///////////////////////////////////////////////////
rocedure TForm1.BitBtn1Click(Sender: TObject);
var
sql1: string;
Stream1: TADOBlobStream;
begin
try
DM.ADOConnection1.BeginTrans;
DM.ADOQuery1.Close;
DM.ADOQuery1.SQL.Clear;
sql1 := 'select * from gzs';
DM.ADOQuery1.SQL.Add(sql1);
DM.ADOQuery1.Open;
DM.ADOQuery1.Last;
// DM.ADOQuery1.First;
stream1 := TADOBlobStream.Create(DM.ADOQuery1.FieldByName('rr')as TBlobField,bmRead);
stream1.SaveToFile('c:\abc.doc');
// RichEdit1.Lines.LoadFromStream(stream1);
stream1.Free;
DM.ADOConnection1.CommitTrans;
except
DM.ADOConnection1.RollbackTrans;
end;
end;
给分哦
Top
13 楼galeboy(狂风)回复于 2001-11-21 19:18:35 得分 20
To ruisheng(咳咳)
这种方法我早就试过,行不通,文件稍大时,读出的文件长度为0Top
14 楼commandio(好好学习)回复于 2001-11-22 14:59:45 得分 20
我也遇到类似的问题,似乎ADO 对 Oracle blob不支持,只要表中含有blob,就不能读出,不管用adotable还是adoquery->select * from 表 ,都会提示数据类型不被支持。
不要浪费时间,建议用bde解决。 Top
15 楼galeboy(狂风)回复于 2001-11-27 17:33:12 得分 100
真的没办法了Top
16 楼zzy4486(世界)回复于 2001-12-05 17:23:28 得分 0
已经解决Top




