是DELPHI的BUG, 还是我的BUG?(100分)

  • 主题发起人 主题发起人 mech
  • 开始时间 开始时间
M

mech

Unregistered / Unconfirmed
GUEST, unregistred user!
前端DELPHI5。0,后端是SQL SERVER7。0。

TQUERY控件的COMMITUPDATES似乎并不能清
缓冲区.
例:
如果在后端有一个表如下:
CREATE TABLE XX (
NO CHAR(8) NOT NULL PRIMARY KEY,
NAME CHAR(8) CONSTRAINT CK_XX CHECK(NAME<>'A')

在前端, 通过
APPLYUPDATES;
COMMITUPDATES
更新数据.

问题出现了:
如果你新增了一条记录,并通过APPLYUPDATES和COMMITUPDATES
保存成功,再修改这条记录, 故意使保存不成功(如:让NAME='A'),
如果再改原先的值,同样保存不成功,提示主键重复.这显然是不合
理的.
原因可能是:
新加的记录,在缓冲区中,即使保存成功后,状态仍是RTINSERT,
其实, 如果保存成功,状态就应该与非新增记录一样.

各位大侠:请指点怎样解决这不问题(不要告诉我用CANCELUPDATES,
因为错误值也同样要显示给用户看)
 
写OnUpdateError事件,显示错误信息,然后UpdateAction设置为uaApplied(
就是让bde以为错误记录已经让你搞好了,从缓冲区删掉这个记录的修改信息)
 
with database1 do
if intransaction then
begin
table1.APPLYUPDATES;

try
commit;
except
rollback;
end;

table1.COMMITUPDATES
end;

table1 may be other datasets, such as query1,etc.
 
试过,似乎不行。
能否进一步指导。
 
TQuery
1. UpdateSQL MUST not be blank
2. RequestLive True
3.CacheUpdated True??
 
你的程序可能有错
 
TO JQW
不是不能更新的问题,
请再看一个我的问题。
 
After database.COMMIT
try table.refresh
 
我认为这是一个大家都会遇上的问题。
说到底,就是TQUERY中新增记录的再次
修改问题。
请各位再努努力。
再加100分给提供正确答案的人。
 
ApplyUpdates是用于CACHEUPDTAES的,至于一条记录会先新增再修改这是很正常的事情,
我写了无数的这种程序,却没有碰到过你的问题,你应该使用CACHEUPDATES,再加上jqw
的方法,不过似乎应该写
Database1.StartTransaction
with Database1 do
begin
try
Query1.ApplyUpdates
Commit;
except
Rollback;
raise;
end;
end;
Query1.CommitUpdates

你最好把SOURCE CODE 贴出来
 
想起来了,好像我在ORACLE 8.X(+DELPHI 4)也遇到类似的问题,
(详见http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=301768)

我怀疑是DELPHI的BUG??
 
To zhuhuan
前端的代码和JQW的一样,在DBGRID中做输入和修改,
另外有一BUTTON, 其CLICK的代码就是JQW的。
能否请您按在后端建一XX的表,先输入一些可以正确保
数, 如:
NO=‘1’
NAME=‘2’,
按BUTTON保存。不关闭FORM,再将这个记录修改,
NO=‘3’
NAME=‘A’
再保存。这时保存失败。
如果您再将NO改回‘1’,NAME改回‘2’,
这时应当是正确的,但系统提示不成功,
错误消息是主键重复。
原因是:
第一次的数据已经存在数据库中,
第三次保存是,系统是按INSERT方式写入的。
所以出错。

 
不妨贴出你的代码
 
To:jqw
我不知道怎样贴代码,因为我的保存代码和您一样,
您也可以很快写一个试试,您立即就会发现我的问题。

除非我将代码EMAIL给你。
 
to: mech
email to me,let me try!?

jiangqw@263.net
 
我也碰到这个问题,我的方法是:
保存数据后,先关闭,再打开;
 
我觉得, 对于这一问题, 可以这样解决:
在Query(或其它)的onStateChange中编写代码:
if YouDataSet.state = dsEdit then
YouDataSet.YouKeyField.ReadOnly := false
else
YouDataSet.YouKeyField.ReadOnly := true;
这样就能防止在修改时改动主键, 如果要修改, 则可以将这条记录删除, 然后重建与此
主键一样的新记录. 这样也符合数据完整性的需要.
 
接受答案了.
 
后退
顶部