首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

这算是bug吗?该如何处理

2012-08-07 
这算是bug吗?今天在帮朋友将一个原来是用 vfp6 写的软件转成 vfp9 时出现一个运行时错误出错语句是一条 vf

这算是bug吗?
今天在帮朋友将一个原来是用 vfp6 写的软件转成 vfp9 时出现一个运行时错误
出错语句是一条 vfp6 中经常使用的命令:Insert Blank After
出错提示是:在启用行缓冲或表缓冲,或者使用完整性约束时,不能执行 INSERT操作。

下断点检查
1. 要插入的表是一个 Cursor(临时表),也没有使用任何 DBC,全部都是自由表,所以不存在完整性约束问题
2. ? CursorGetProp('Buffering') 结果返回 1,证实没有启用表或行缓冲
至此,vfp 错误提示指出的原因全部排除

因为一开始就只用 vfp9,所以没有用过 Insert Balnk Before/After 这样的命令,上网查找到这一贴:
http://topic.csdn.net/t/20060529/15/4786214.html
根据此贴 12 楼的提示,可能是因为表存在索引的原因,执行:
list stru 命令,结果是所有字段均没有索引

几经搜索,发现在调用出错代码的父模块中有下列语句:
...
index on ename tag ename
seek 'ccc'
if found()
...
endif
delete tag all
...

去掉 index,改 seek 为 locate 后,错误排除!
尽管这个临时表创建了一个临时索引,用完后索引已全部删除,但仍无法使用 inser ... before/after 命令

由于要搜索的表很小,所以这里改成 locate 没有性能问题,但如果表很大呢?
因为朋友要求点插入按钮后,空行要出现在 grid 的指定行之后,以便参照上下记录来修改数据,这段代码也不想做大的改动,所以不想将 insert ... after 改成 append,难道只能用 locate 了吗?
原来的代码在 vfp6 中执行不会出错,但在 vfp9 中不行,怀疑是一个 vfp9 bug

vfp9 中可以这样重现此问题:

SQL code
去掉第 2,3 行前的注释符号后,执行下面代码可看到发生的错误create cursor ttt (f1 C(10))* index on f1 tag f1        && 创建一个临时索引* delete tag all            && 删除所有索引insert blank before



[解决办法]
create cursor ttt (f1 C(10))
index on f1 tag f1 && 创建一个临时索引
delete tag all && 删除所有索引
insert blank before

在VFP6.0下运行正常。严格的讲,应该是个错误。
[解决办法]
在VFP9 确实如此,可惜没人去修复了!
[解决办法]
在VFP9下测试,确实存在此问题,一般不用insert blank before, 如果一定要用,表中增加唯一标识的字段,根据此字段的值,做处理再插入
[解决办法]
你在
insert blank before/after
之前加一句
CursorSetProp('Buffering',1,'表名')
就可以了。
3 楼我代码在 vfp9.0 sp2 7423 + xp sp3 中加上 CursorSetProp('Buffering',1,'表名') 就不报错了。
[解决办法]
这是高手与高手之间的讨论...我只有学习的份

不过,此问题,我是遇到过的,但当时没有解决
[解决办法]
留个脚印,以前碰到过,走不过绕道了。

热点排行