主/从表的问题
我的表A(主)和表B(从)是主从关系,如果想删除A表中的纪录时,如果B表中还有子纪录就会出错,我用Try..except系统还是不停的报错,而且是不停的出现错误对话框,除非关闭了程序,为什么会这样呢?
try
delete A
except
shoemessage('B表中还有子纪录')
end;
它会先显示这条Message ,之后就不停的出现系统的错误对话框
问题点数:20、回复次数:22Top
1 楼gaden007(斌)回复于 2001-12-19 09:40:48 得分 0
。。Top
2 楼gaden007(斌)回复于 2001-12-19 09:47:30 得分 0
怎么我在第一页见不到我的问题的Top
3 楼yinmingke(黄豆汤)回复于 2001-12-19 09:53:15 得分 3
让我来告诉你吧,添加数据要先在从表添,再添从表.删除数据要先删光从表的,然后再删除主表的.因为主表的1条记录对应着从表的多条记录.那么,我问你,如果主表的记录不存在了,对于从表的那些相对应的记录还有存在的必要吗?(至少在逻辑上是这样)Top
4 楼gaden007(斌)回复于 2001-12-19 10:28:58 得分 0
谢谢,这个我知道,但我在删除主表纪录时是不知道从表还有没有纪录的,所以
就用try...except,但还是不行Top
5 楼flyonet(人生如梦【★】梦如人生)回复于 2001-12-19 11:25:44 得分 3
try
delete A
except
shoemessage('B表中还有子纪录')
end;
是没有执行Delete A语句失败,所以才showmessage!Top
6 楼gaden007(斌)回复于 2001-12-19 11:35:04 得分 0
如果我的从表里还有纪录那肯定执行Delete A 会失败,所以就用ShowMessage,但问题是它显示完Message后不过停的出现系统的错误信息,直到关闭程序,请问这是为什么Top
7 楼zzllabc(抱朴子--清心释累,绝率忘情)回复于 2001-12-19 11:42:47 得分 3
在IDE里运行的呢?还是直接运行程序?Top
8 楼gaden007(斌)回复于 2001-12-19 11:50:24 得分 0
直接运行了Top
9 楼gaden007(斌)回复于 2001-12-19 11:52:15 得分 0
就算是在IDE里运行正常也最多显示一次系统错误信息之后就没事了,但现在是不停的显显系统的错误, 不给做其它事Top
10 楼gaden007(斌)回复于 2001-12-19 12:32:02 得分 0
up...Top
11 楼flyonet(人生如梦【★】梦如人生)回复于 2001-12-19 12:42:40 得分 3
都写出来看看
Top
12 楼yinmingke(黄豆汤)回复于 2001-12-19 13:22:46 得分 0
老大阿,在删除你的主表记录的时候你不会先去子表里面查询一下有没有相关联的记录存在吗?
delete A 是删除 a表中所有记录的意思吧?每删一条就会返回一个错误,当然会不停的显示系统错误了!Top
13 楼Rabbit_luo(走入深秋)回复于 2001-12-19 13:35:49 得分 4
如果在删除主表记录时,从表有记录可通过错误代码来判别,而不能简单地通过TRY--EXCEPT来!如果从表记录可删除的话你可在删除主表时通过触发器达到先删除从表的记录,如此一来就不会出错啦!Top
14 楼gaden007(斌)回复于 2001-12-20 15:44:31 得分 0
昨天不知干啥,老是回不了贴
yinmingke(黄豆汤) 你的意思我明白,我就是不想这样做,Delete A 只是这样写,我的代码不是这样写的:
procedure TFMshift.delClick(Sender: TObject);
var i:integer;
BookMarkList:TBookMarkList;
BookMark:TBookMarkStr;
begin
BookMark:=Qu_mshift.Bookmark;
BookMarkList:=DBGrid1.SelectedRows;
if BookMarkList.Count>0 then
begin
if MessageDlg('是否要删除这些纪录。',mtConfirmation,[mbyes,mbno],0)=mryes then
begin
for i:=0 to bookmarklist.Count-1 do
begin
Qu_mshift.BookMark:=BookMarkList[i];
try
Qu_mshift.Delete;
except
// raise exception.create('这条纪录不能删除 ');
on E:Exception do
begin
ShowMessage('错误:'+E.Message);
end;
end;
end;
BookMarkList.Clear;
end;
end;
end;
主表是Mshift它的从表是Mstaff
Top
15 楼gaden007(斌)回复于 2001-12-20 16:09:10 得分 0
再帮帮我好吗?Top
16 楼meady()回复于 2001-12-20 16:23:35 得分 4
把异常捕捉放在循环外面试试Top
17 楼gaden007(斌)回复于 2001-12-20 16:27:32 得分 0
谢谢,马上试试Top
18 楼hj_cn(风影)回复于 2001-12-20 16:46:45 得分 0
try
delete A
except
shoemessage('B表中还有子纪录')
end;
其实你这样写不全面,可能是多种情况产生的异常,所以并不是只要B表有记录就会产生异常
应这样判断在删除主表之前先判断从表有没有记录如有或者先删除从表再删除主表或者不能删除这个由你定。Top
19 楼gaden007(斌)回复于 2001-12-20 17:08:27 得分 0
meady() :刚试过了,还是一样
hj_cn() 看来也只有这样了
Top
20 楼gaden007(斌)回复于 2001-12-21 11:19:08 得分 0
up...Top
21 楼meady()回复于 2002-01-14 20:41:08 得分 0
如果没解决的话,错误信息写出来看看Top
22 楼meady()回复于 2002-01-14 20:41:16 得分 0
所有的Top




