请大家帮我分析一下代码

秋天之落叶 2019-08-27 10:42:01
我有一个 基本信息表,一个 监督明细表
在一个功能模块中,查询 监督明细表,选择行记录,然后删除,不知道为什么,删除监督明细表记录后,竟然同时删除了基本信息表的一行记录,该行记录和 监督明细表 的关系是:监督明细表 中的 检查人 是 基本信息表 的一条基本信息记录。
我仔细的检查了两个表之间设置,没有关联表和语句存在,查询的ADOQ监督和DBGridEh16也是监督明细表专用的,基本信息表使用ADOQ信息和DBGridEh1,而且两个功能模块没有任何关联。
我也仔细的检查了语句,和网上的语句对了一下,没什么问题。
这是一个非常奇怪的问题,两个表的记录还能有什么方法关联到一块删除记录呢?请大家帮我分析一下。
procedure TFormMain.Button45Click(Sender: TObject);
var
i: Integer;
begin
if (DMADO.ADOQ监督.IsEmpty) or not(DMADO.ADOQ监督.Active) or (DMADO.ADOQ监督.RecordCount = 0) or (DBGridEh16.SelectedRows.count = 0) then
Exit;

for i := DBGridEh16.SelectedRows.count - 1 downto 0 do
begin
DMADO.ADOQ监督.GotoBookmark(DBGridEh16.SelectedRows.Items[i]);

if (DMADO.ADOQ监督.FieldByName('完成时间').AsString <> '') then
begin
if qzw = '员工' then //操作人的全局变量
begin
ShowMessage('选择的记录中包括已经完成的记录,组长及以上权限可删除!');
Exit;
end
else if Application.MessageBox('选择的记录中包括已经完成的记录,确认删除选定的记录吗?', '提示', MB_OKCANCEL + MB_ICONQUESTION) = IDOK then
begin
DMADO.ADOQ监督.Delete; //(换成DBGridEh16.SelectedRows.Delete也是同样的问题)
end;
end
else if Application.MessageBox('确认删除选定的记录吗?', '提示', MB_OKCANCEL + MB_ICONQUESTION) = IDOK then
DMADO.ADOQ监督.Delete;
end;
end;
...全文
109 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lao_yunger 2019-09-01
  • 打赏
  • 举报
回复
sql server 中设了级联为开
  • 打赏
  • 举报
回复
GotoBookmark需要之前GetBookmark。另外,这个ADOQ监督是Query吧,不是Table?
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
我有几个模块也是使用的GotoBookmark,但另外使用的是edit和post,没有出现类似的错误。
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
GotoBookmark使用的时候需要初始化吗?
我前面并没有使用到 基本信息表 的MARK啊?

两个表的关联可以用什么方法查看关联?

我把语句全部修改为 delete from 监督明细表 where 序号=XX 后,就没有这个问题了。

真是奇怪了?!
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
引用 9 楼 天行归来 的回复:
如果记录集锁(LockType 是 ltOptimistic),肯定是这样。
如果表关联查询,想删除记录,可以采用 批量更新(LockType 是 ltBatchOptimistic)+删除记录代码,ltBatchOptimistic 目的只是内存对数据操作,并不做物理提交,真正记录删除由sql或者其他方式解决。

我不想再用ltBatchOptimistic了,比较乱,而且还有BUG,上次帖子我提出过一直没有解决。
我已经修改为delete 数据表的方式解决了,就是条件有点啰嗦,效果很好。
看来sql要比delphi自带的语句安全得多,以后还是尽量少用自带的方式吧,我遇到的很多稀奇古怪的问题都是这样造成的,哈哈
天行归来 2019-08-27
  • 打赏
  • 举报
回复
引用 7 楼 秋天之落叶 的回复:
[quote=引用 5 楼 早打大打打核战争 的回复:] 那估计你的查询涉及到两个表,所以你删除查询中的某记录,两个表中的对应记录都被删了
是这样吗?联合查询时,会删除两个表记录?[/quote] 如果记录集锁(LockType 是 ltOptimistic),肯定是这样。 如果表关联查询,想删除记录,可以采用 批量更新(LockType 是 ltBatchOptimistic)+删除记录代码,ltBatchOptimistic 目的只是内存对数据操作,并不做物理提交,真正记录删除由sql或者其他方式解决。
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
要真是这样,我可以把联表查询的ADOQuery1数据集clone给ADOQuery2,用ADOQuery2显示后再选择删除,是不是就OK了?
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
那估计你的查询涉及到两个表,所以你删除查询中的某记录,两个表中的对应记录都被删了

是这样吗?联合查询时,会删除两个表记录?
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
我似乎找出了原因:
我简单到DBGridEh16.SelectedRows.Delete也会删除基本信息表的记录,返回去查看,我发现查询的时候我使用了联表查询:
select a.姓名,b.分组 from 基本信息表 a,监督明细表 b ......
是不是和这个有关系?
一个新的发现,如果这样的话,我可以这样联动删除两个表的记录了,哈哈
是不是联表查询删除时,两个表的关联记录会被同时删除?
请高手给解释一下?
  • 打赏
  • 举报
回复
那估计你的查询涉及到两个表,所以你删除查询中的某记录,两个表中的对应记录都被删了
秋天之落叶 2019-08-27
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
GotoBookmark需要之前GetBookmark。另外,这个ADOQ监督是Query吧,不是Table?

是ADOQuery

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧