关于数据库的错误(50分)

  • 主题发起人 主题发起人 waterfish
  • 开始时间 开始时间
W

waterfish

Unregistered / Unconfirmed
GUEST, unregistred user!
最近,我在写程序的时候发现一个奇怪的错误.具体情况如下:
后台是personal orcale 7.3,我在一个form里有三个按钮,一个是插入,一个是
修改保存,一个是保存,如果我按插入新增一条记录后保存,再用修改保存进行修改后的立即保存的操作,结果错误出现了,错误的大意是"现在这条记录正给别的
用户修改,不能存盘",但很明显,我是在单机上用的数据库,用户就只有我一个.
后来,我在修改保存中加入了一段代码进行延时,结果当延时时间足够大的时候,
这个错误就不会出现了.请问那位高手可以告诉我到底是什么问题?是BDE的问
题,delphi的问题还是数据库的问题?
 
比较奇怪!不会是数据库锁表吧!
 
应该肯定的说是Delphi提供的锁机制和Oracle的提供的记录锁机制有区别造成的。
 
commit了没有。
 
当然commit了,delphi的post操作本身就是让后台数据库commit的
 
使用缓冲区试一试!
 
请说出具体方法!!
 
TTable,TQuery组件的CachedUpdate属性为TRUE,在修改或插入后,用ApplyUpdates进行提交
 
数据库的dberrors例子,可以参考
----瞎说
 
you must not commit
 

这个问题我很清楚是为什么,不过你得先告诉我你得表中都有那些类型得字段,
比如有没有Numberic字段,text字段等等?另外你是否插入操作和修改操作用法
不同,比如一个是用Table ,一个使用Query等?

xi,xi要知道我前天才被搞定过一把!
 
hanson:
数据库的结构大概是这样:
CREATE TABLE PermitFile (
Type Char(1) Not Null,
check (type in ('B','U')), --许可证类型
--('B'表示经营证,'U'表示使用证)
No1 Char(4) Not Null, --许可证号(前四位)
No2 Char(2) Not Null
check (to_number(No2) between 1 and 12), --许可证号(后两位),
--(01-12)用于确定年审时间
FirstDate Date, --初次领证时间
WorkNo Char(10)
References WorkFile(No), --关联工程档案号
Applicat VarChar(60), --申请单位
Legal VarChar2(8), --法人代表/负责人
Addr VarChar2(60), --所在地址
Area Char(2), --所属区域(编号)
MailAddr VarChar2(60), --通信地址
ZipCode Char(6), --邮政编码
Relation VarChar2(8), --联系人
RelaTel VarChar2(16), --联系电话
Chief VarChar2(60), --主管部门名
ChiefAddrl VarChar2(60), --主管部门地址
ChiefZip Char(6), --主管部门邮政编码
Economy Char(2), --经济性质(编号)
DealRange Char(2), --经营范围(经营证)(编号)
Wield Char(2), --使用性质(使用证)(编号)
FireHouse VarChar2(60), --消防审批部门
Patent VarChar2(60), --工商发照部门(经营证)
PatentNo VarChar2(30), --营业执照号码(经营证)
SiteKind Char(2), --站点性质(编号)
GasPower Number(12,2), --贮气能力
Ration Number(12,2), --交费定额
Fund Number(1) default 0
check (Fund Between 0 and 1), --是否已交抢险基金
Safety Number(1) default 0
check (Safety Between 0 and 1), --是否已交公众责任险
Logout Number(1) default 0
check (Logout between 0 and 1), --注销标志
constraint con_No primary key(Type,No1,No2) --许可证类型及号码形成主关键字
)
/
其中还有一个数据库级的触发器,具体的文件放在了公司没有拿回来,如果您能根据
这些结构解决我的问题那就太好了,如果还不行,我再贴上具体的结构.
 
用的是table吧,改用query加事物处理。在看看database的共享级设定。
 
我想你这问题有两种可能
1,如果你使用了TDATABASE,那么可能是你开始了事物 starttransaction后
没有去用COMMIT更新
2.你碰到了锁。 在你的表中设置好索引,使用CACHEUPDATE ,可以完全解决这个问题
没有好索引,你新添加的数据总是在表的最后堆砌, 容易锁住
 

原因可能是这样的,一般来讲出这种错误的情况是这样的:
数据库中的某条记录的个别字段的长度和实际的存储大小不一直,我估计
可能是出在Ration,GasPower等几个带小数的numberic字段上,你的大概操作
可能是这样的:
先用table插入了一条记录,然后用query更新了该记录,这样造成了不一
致:
比如说: Ration字段如果你输入的是50.253,小数部分实际已经超出了你的
定义,用table插入没事,用query使用 ‘ update set ration=50.253 ',而后
再用table编辑或更新时肯定会出事! 再一个就是检查所有的char,text字段,看
得到的长度和实际存储的长度是否一致!
解决办法,1.严格控制输入格式;2.将字段位数加大!
如果我的描述和你不同,你可以再和我联系,我还有别的办法,不过,我明天
就放假了,可以直接发信给我!
xi,xi

 
我想请大家注意一下:
我用的是personal oracle ,无论什么时候只有一个用户在使用
 
一个用户也可能锁的, 自己的查询锁住了自己的更新,过去我就碰到过好多次
 

为什么不试试我的建议?这可是我费了很久才研究明白的!!
:(
 
hanson:
并不是我不想用你的方法,你的方法我也正在试。这个程序里有的只是字符型的,很少有数字型的,而且长度我也控制得很好,但不知道为什么会这样
 
waterfish:
可以把问题结束了吧?
在不结束,我就要强行结束了 :)
 
后退
顶部