万恶的blob,这是怎么回事(100分)

  • 主题发起人 主题发起人 tunick
  • 开始时间 开始时间
T

tunick

Unregistered / Unconfirmed
GUEST, unregistred user!
我在sql中用image类型的字段来存放文件,文件不大,每个都不超过10k,在写入库里的
时候出现错误'invalid blob handle in record buffer'说是bde的错误...文件很小
不会是因为size的原因...这个问题怎么回事啊...谢谢大虾.
 
我改称ado以后就没有这个问题了..
但是我不能使用ADO..如果需要更改BDE,该改哪里呢?
还有就是这个问题的出现是在库里的纪录多了以后才冒出来的.
使得我既不能写,也不能读,而且错误原因都是上面所说的那个.
搞的我极其郁闷...他mm的...要是分不够,偶愿意在家100大洋..
大哥大嫂们帮帮忙....//bow...
 
修改BDE的Configuration->Drivers->Native->MSSQL->BlobSize的值,
他对你的应用有影响。
 
这个值我曾经改过。。。解决不了问题的说。。。。
 
我觉得不是大小的原因,把你写库的代码帖出来看看吧。
 
bde中blobcache的大小?
 
先设置BDE Administrator中的与Blob相关项的值,再重新建立你的BDE连接。
  也可以不改BDE Administrator中的设置,直接改你的BDE连接设置即可。
 
整个这个问题的出现是因为库里的记录增多才出现的,而且出现过一次以后这个东东
就每次都出现,可是我奇怪为什么换成ADO连接以后就没有毛病,
我用delphi里面的
TblobField(Table1.fieldbyname('xx')).savetostream和
TblobField(Table1.fieldbyname('xx')).loadfromstream方法来调用
他是直接调用呢还是通过BED的API来调用呢...
如果两者是分开的,那么我可不可以直接调用BDE的API呢..
我查了查这个问题出现的原因,是这个样子的
DBIERR_INVALIDBLOBHANDLE The logical BLOB handle
supplied in the record buffer is invalid.


Any portion of the data within the BLOB field can be retrieved,
starting from the position specified in iOffSet, and extending
to the number of bytes specified in iLen. pRecBuf should contain
a BLOB handle obtained by calling DbiOpenBlob. DbiGetBlob can
access data larger than 64Kb, depending on the size you allocate
for the buffer.

这个肯定不是文件大小的问题,因为每一个文件都没有超过8k的....
郁闷啊....郁闷.....

 
你更改了BLOB SIZE后必须要将原来的别名删除后重新建立!才可以使BLOB SIZE 生效!
 
还是要把BLOBS TO CACHE改大些,请认真看BLOBS TO CACHE的帮助。特别是如下这段:
Setting a value 100 means the application can work with a maximum
of 100 BLOB records cached. Fetching more than 100, then scrolling
back 100 records results in an "Invalid Blob handle in record buffer"
error message.

BLOBS TO CACHE的默认值是64,那么就是说包含blob字段的query or table的记录数
不能超过64条记录,所以你要么改大BLOBS TO CACHE的值,最大可达65535,要吗提取的
记录数(cache)不能太多。
还有记录数太多的话要相应改大BLOB SIZE的值, 默认是32K,一个文件8K的话,那么只能
cache 4条记录,最大可为1000K。所以cache的记录数不能太多。

另:修改bde的参数后无须重建别名,只要重新启动应用程序就ok.
 
Ado默认的cachesize是1当然就不会有问题了(即client 只cache一条记录)
 
一定要修改BLOB SIZE 和 BLOB TO CATCHE,我以前也遇到过类似的问题,改了之后就ok了
 
pqx的见解是正确的,smj_9547的不正确.要补充的是要是在程序中使用了Database控件
的话,在改完bde后Database的中的相关参数不会随着改变,因为此控件是在bde改动前
放上去的,要检查Database控件的BLOBS TO CACHE是否改变,否则程序还是会有问题的.
 
提问者:
如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明

http://www.delphibbs.com/delphibbs/rules.htm
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
946
DelphiTeacher的专栏
D
后退
顶部