ADO与数据库中非捆绑图像字段的处理问题。100大分,酬劳各位。(100分)

  • 主题发起人 主题发起人 qqhp
  • 开始时间 开始时间
Q

qqhp

Unregistered / Unconfirmed
GUEST, unregistred user!
我在编一个数据库后台管理程序时遇到两个问题。
先讲一下我的方法,是用ADO访问数据库,但是考虑到使用Delphi的ADO控件,
连数据库比较慢,so我是使用非绑定方法,即没用到Database,Table等基本组件。
于是遇到了许多意外的问题,但翻阅了n多Delphi网站都没有答案。

【1】edit1.Text :=rescordset1.Fields['SHENG'];
本句是将一个字段的内容显示到编辑框;
但若字段‘sheng’为空值(NULL),在运行时总会出现EVariantError异常,
我使用Delphi中许多判断空值的方法(varIsNull等)都不行。我知道在VB中用ISNULL
就ok了。Delphi不知是否要用ADO自带的什么方法,还请赐教。

【2】我现在要用image组件显示数据库的图片(jpg格式),但不知如何保存图片到数据库,
或如何从数据库读出。我使用的是ORACLE8,图片字段设定类型是BLOB.
参阅网上的一些方法,多用流的方式。我使用下列语句:
try {存入图片}
MStream:=TMemoryStream.create;
imgPic.Picture.Graphic.SaveToStream(MStream);
MStream.Position:=0;
{ ***********************}
rescordset1.Fields['picture'].value.LoadFromStream(MStream);
{ ***********************}
finally
MStream.Free;
end;
但编译时通不过,问题就在我用****括起来的那句(rescordset1.fields....);
系统提示:Type not allowed in OLE Automation call.
不知如何解决,有劳各位高手了。Thanks.

 
必須這樣:TBlobField(activesql.FieldByName('picture')).loadfromStream(MSStream);
 
第一個問題在delphi中無法解決,好像和數據庫有關係,我們在編程時另外加了一個bool型字段,存放
picture字段是否為空
 
TO lazy_cat:
Thanks,先。
第二个问题已按你的方法试了,不行。编译错误提示类似。
第一个问题你理解错了,并非只判断picture字段,对许多varchar2字段也要判断是否
空值。请大家继续提供指导。
 
myfield:=rs.fields[0];
if myfield.isnull then
...
 
第一个问题试试:VarIsEmpty(。。。)
第二个问题看已答问题。
 
oracle8的blob真是麻烦,ado不认,可以用long raw 。
 
第1个问题,判断null用
rescordset1.FileByname('SHENG').IsNull 不行吗?
也可以不判断,直接
edit.Text := rescordset1.FileByname('SHENG').AsString 呀
 
To 以上各位热心大侠:
诸位的方法我早已试便,EVariantError异常照旧。继续指教。Thanks.
 
blob字段类型改成 long raw 类型的字段也不行?
 
这句:imgPic.Picture.Graphic.SaveToStream(MStream);
里面的 Graphic 是否要换成 Bitmap ?
 
我試了一下,在Ado中不能用TmemoryStream,只能用TOleStream,但TOleStream.create的參數
我卻不知怎麼設置.反正編譯是可以通過的,還請個位大俠不吝賜教,
關於第一個問題是不存在的,字段為空我怎麼試都不會出錯,寫法為
1.fieldbyname('name').asstring;
2.fields['name'].value
都是正確的.我用的是ADOQuery,難道是你的Adodataset.commandType有問題,很抱歉我沒有
時間去試了,用ADOQuery肯定沒有錯的,delphi在判斷為空也肯定不行的
 
關於第一個問題,我是說Delphi不能判斷binery字段是否為空.
關於第二個問題我知道該怎麼做了,賓且存了進去,不過我用的sql server 7,
釋放的時候還有一些問題,沒有時間調適了
var
MStream:TOlestream;
tempstream:TMemoryStream;
stream:IStream;
begin
try
tempstream:=TMemoryStream.create;
image1.Picture.Graphic.SaveToStream(tempstream);
tempstream.position:=0;
Stream := TStreamAdapter.Create(tempstream, soOwned);
MStream:=TOleStream.create(stream);
MStream.Position:=0;
qrycompany.open;
qryCompany.edit;
TBlobField(qryCompany.FieldByName('picture')).loadfromStream(MStream);
qrycompany.Post;
qrycompany.close;
finally
tempstream.free;
// MStream.Free;**************有問題,請高手賜教
end;


 
To pipi:
Thanks,先。
我现在已定下用BLOB字段,且之前未听说ADO不支持BLOB,我知道用VB5实现得了。
To lazy_cat:
Thanks very much.但可能是我没预先讲讲清楚,我没有用ADOQuery等组件,连到数据库
的代码是参照网上看到的一篇文章:《在DELPHI程序中使用ADO对象存取ODBC数据库》。
转录如下:
var AConnection, ARecordSet : variant;
begin
{创建一个临时的ODBC数据源,指向一个MsAccess数据库,并利用此DSN建立一个数据库连接}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.open ('DSN=test;uid=zp;pwd=qq');
{建立一个数据集对象,并从数据表中提取数据}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open( 'wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable);
...
end
所以很多用组件可行的方法现在统统得另想它法。后悔没用微软自个儿的VB.但现在也得继续下去。
Now,又遇上个问题,就是在打开含有picture(BLOB类型)字段的表时,同样的语句(见上),运
行时,打开此表总提示:‘无法指出的错误’。然后表中的内容根本没显示。
请诸位高手指教,Thanks.
 
qqhp:
很抱歉,我也不知道是怎麼回事,我按照你的程序敲了進去,用的也是Access,
雖然沒有出錯,但是用了好長時間也不知道是怎麼去存儲Blob(在Access是Ole).
所以我建議你如果方便的話,還是用控件的形式,應該改動不大,控件的名稱就取ARecordSet
,它的屬性對應函數的參數,應該很方便,你看呢.
如果實在改動太大,我在幫你問問.
lazy cat
 
多人接受答案了。
 
TBlobField(qryCompany.FieldByName('picture')).loadfromStream(MStream);这句我这里为什么
编译通过不了提示 invalid typecast 其它语句都一样(本人用的是sql7),请赐教,谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部