Oracle中圖片處理問題(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大俠﹕
小弟想在Oracle中插入圖片﹐並用Delphi顯示出來。表已建好﹐並插入了圖片。問題是
我怎么將圖片Show出來﹐並能對該表作操作﹐如改插入另一個圖片進去。我用Table和Query
控件﹐想使Active設為True﹐但卻出現Invaild field type錯誤﹐不知是怎么回事﹖不知哪
位大俠有類似的例子貼上來﹐讓小弟學學﹐實在感謝﹗
 
我用的是BFile﹐不知好不好﹐若哪位大俠有更好的建議﹐請提出哈。
 
bfile 不好
应该用long raw
 
同意ARM。
对于图片等在ORACLE中应该使用LONG RAW类型。
 
那具體怎么操作呢﹖哪位大蝦有沒有例子﹖我不知道怎么操作呀﹖從數據庫讀出﹑修改﹑
保存及怎么把圖片Show出來﹖還有我上面的錯誤是怎么一回事﹖
 
在ORACLE中对于图片最好选择LONG ROW类型
在DELPHI中通过DBImage控件操作
至于Invaild field type的错误提示可能是你的数据库中TABLE建的有问题。或是
其它。一般这种LOB字段在DBGrid中显示为[BLOB]。
 
BFile 是只读的,文件必须已经在服务器上存在,客户端不能修改他。
所以你可以用 BLOB 或者 LONG RAW 类型,不过 BLOB 类型是oracle8新支持的类型,
太先进,不少数据库引擎不能支持他,所以还是用老牌的 long raw 类型比较好

另外,关键是你要保存的图片是存在在哪里的,是一个一个的图象文件(bmp、gif文件等),
还是当场画出来的图片,还是 Clip Board 中的?一般来说,怎么样保存的图片,就用
相反的办法显示出来,比如如果是用图片文件(LoadFromFile)保存的,就SaveToFile保存
到临时文件用 TImage 显示。如果是 TDBImage 上画出来的,当然也就用 TDBImage 显示
 
用long row数据类型,写这个字段的时候用流的方式来操作
 
blob数据类型非常方便,关于这个字段的D5写入问题我已经解决。
 
To Pipi﹐lyd_2000,zhuny:
三位大俠﹐請問有源代碼嗎﹖若能發給我﹐不勝感激﹗zhkfy@21cn.com。
 
哪位大俠有源代碼嗎﹖給我看一下﹐好嗎﹖我的書上沒有講呢。謝謝﹗
 
1.use stream to handle;
2. If you focus speed or want to use Blob type ,
I suggest you to use DOA component;

 
现在主要是处理Blob字段的问题,哪位大虾已经解决的话给我发一个源代码,
本人将以本人的著作《Delphi编程疑难》作为酬谢。
 
大俠們﹐有源代碼嗎﹖上面說的﹐小弟還是不太明白耶。
 
to:dadabox,ji_xuegang

1.表结构
create table myimages(
filename varchar2(30),
enterdate date,
image blob);
2. use stream

...
try
Mystream:=Tmemorystream.creat;
MyStream.loadfromfile(Filename);
MyStream.position:=0;
Database1.Open;
database1.StartTransaction;
try
WITH Query1 do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO myimages VALUES(:filename,:enterdate ,:newimage)');
ParamByName('filename').AsString:=GetFileName(Filename);
ParamByName('enterdate').AsDateTime:=Now;
ParamByName('newimage').LoadFromStream(MyStream,ftBlob);
ExecSQL;
end;
Database1.Commit;
except
On E: EDBEngineError do
{异常处理}
....

finally
mystream.free;
end;

3. use DOA
.....
var LOB: TLOBLocator;

Buffer: array[0..99] of Byte;

begin

// insert into lobtable (id, lobcolumn) values (:id, empty_blob())

// returning lobcolumn into :lobcolumn

with LOBQuery do

begin

SetVariable('id', 1);

// Create a new BLOB (initially Null)

LOB := TLOBLocator.Create(Session, otBLOB);

// Assign it to the returning variable

SetComplexVariable('lobcolumn', LOB);

Execute;

// After the insert, use the LOB Locator to write the data

LOB.Write(Buffer, 100);

LOB.Free;

end;

end;
4. 显示图像可以使用Tdbimage ,取数据和存数据过程相反。



 
各位實在對不起﹐現在我還不能結束貼子。
to puyunpeng﹕
我照著你的去做了﹐但是在ExceSQL的時候﹐出現下列錯誤﹕
ORA-01461:can bind a long value only for insert into a long column。不知是為什么﹖
另外﹐你的第三個用DOA里的LOBQuery控件﹐我沒有。所以﹐我還是沒有試出來。能進一步
解答嗎﹖
 
invalid field type ,如果是oracle8,经常是因为你用了blob类型的字段,
很多不支持,比如ado和没有升级的bde
你最好改为 long raw 类型,就bde、vado都支持了。
 
To Pipi.:
請問應該怎么改﹐若只是建表中改了﹐那么用上面的那個例子來試還可以嗎﹖
 
To dadabox:
pipi 说的有道理, 请问你的环境是什么: D4 or D5, oracle是 8.0.5 or 8.1.5?
table 的 结构?
你要操作的图像文件一般多大?
 
后退
顶部