写一个基于MS SQL Server的C/S程序时,出现错误:"Record/Key deleted",请高手解决,已经基本解决,加100分的许诺会兑现 ,To

  • 主题发起人 主题发起人 王建伟
  • 开始时间 开始时间
To : 吊子
我是在向主表POST后出错,但是数据却成功写进了,如果我主从表都不设主键反而倒不出错,
设了倒出错,这是怎么回事?
 
这个问题不久前我遇到过,如果不通过dbgrid操作而是直接采用SQL语句
增加、删除纪录试可以的,如果通过dbgrid操作,delphi必须知道你是对
那一条纪录进行操作,因此必须有主键标识你所访问的记录,而且该主键
不能由SQL Server自动生成,因为在增加一条新纪录时,delphi不知道该
新纪录的主键值,我的解决方法如我前边所述
 
to 王建伟:
吊子说的全对, 你的问题多半是:
你所用的Table中用到过滤,而你所操作的记录改变后正好满足了这个过滤条件,记录被
TABLE自动过滤掉了!(我想,这一点最有可能发生!)
两种情况:1. master/detail 结构, 你输DETAIL时改变了关联字段post, 报错!
2. 你定义了过滤条件, 新记录满足了条件被当场过滤, 报错!



 
To : 吊子
mingliangzhou
你们说的非常正确,就是filter的问题,我会给你们分的,共200分,我不知道那一
百分怎么加?
先别急,来者有分,顺便再问问,查询的时候我这样做的
Table1.Close;
Table1.Filtered := False;
Table1.Filter := 'XiTongDanHao = '+XTDanHaoStr;
Table1.Filtered := True;
Table1.Open;
当我插入一条记录后,Table1.post就会出错,插入提交的时候没有过滤啊。
这是怎么回事?我只好在插入前这样
Table1.Filter := '';
Table1.Filtered := False;
问题就解决了,可是想不通。为什么?
另外我不想从表的DBGrid移动就写入,我想在往从表的DBGrid里写完后,先Post主表
再Post从表,怎么办?
 
没有关键字
 
嗬嗬!这就对了!

Table1.Close;
Table1.Filtered := False;
Table1.Filter := 'XiTongDanHao = '+XTDanHaoStr;
Table1.Filtered := True;
Table1.Open;
这就是你过滤的条件,但是你post的时候忘记了这第一点:
在Table1.Newrecord事件中你应该写上
Table1.FieldByname('XiTongDanHao').AsString:=XTDanHaoStr;
这样就不会出错了! 这也说明了你出错的原因,就是因为新插入的纪录的这个字段不等于
你的过滤条件,被Table自动过滤掉了!

对于你的第二个问题,我没有看懂,DBGrid是和表自动连接的,如果你的bde连接属性是自动提交的
话,当DBGird移动后,就会自动post到表中的,然后在其Afterpost事件中写post主表的语句就可以了!

 
To : 吊子
1、表向数据库Post的时候过滤条件也起作用吗?还是只从数据库取数时起作用?
2、你觉得先Post从表再Post主表合适吗?我觉得应该先Post主表,象你说的在从表的
afterpost中post主表,一是后提交主表,一是每提交一次从表都提交一次主表这样合适吗?
 
To 王建伟,
1:Table是这样的!就是说只要有过滤条件,那么当对表进行插入时,它是在过滤后的纪录的基础
上进行操作的,并且这种过滤是自动的!!不信,你换Query ,将你的过滤条件写成Query1的where条件,就不会出错!
就是因为Query不是自动的!只有Query.open的时候才再次对数据集进行筛选!

2,我一般的做主从表的时候,都是先post主表在post从表的!当主表中有如“数量合计”
,“重量合计” 等子段的时候,先post从表,在将计算后的结果post主表相应的字段中!
 
To : 吊子
明白了,谢谢。给分,那一百分怎么给你?我的Email : wangjw@bitauto.com
 
后退
顶部