關于忽略異常的話題﹐請大俠幫忙﹗﹗﹗﹗

Ivanwxr 2003-04-29 03:03:07
我在對數據保存時出現在這樣的異常﹐是關于主鍵的﹐說數據庫中已經存在這筆記錄的錯誤。我要求達到的效果是﹐在數據庫中有的數據就不會保存到數據庫中﹐并且不會出現那個關于主鍵的異常信息。在線等待﹐先謝謝了﹗
...全文
72 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyh800220 2003-04-30
  • 打赏
  • 举报
回复
try
...
except on 异常
end;
watercsdn 2003-04-30
  • 打赏
  • 举报
回复
一、表结构

1、表TK结构:
N1:string; ->名称
N2:string;->内容
t11:string:->类型
tk表存有记录30000条。

2、表f-leixin结构:
F1:string;->标识名
leixin:string:->类型(有200个不同类型)
YTI:integer;->记录数
LX表存有不同“类型”的记录200条。

3、我用ADO连接ACCESS数据库。


二:要实现的目的。
我想把TK表里符合f_leixin表类型的记录全部查询出来, 并将查询结果进行计数, 然后将值存入
f_leixin表的YT字段。
三: 我自己的编程
我主要是用加循环遍历的方式,用一条SQL语句,先进行查询统计、替换,然后循环f_leixin表,
这样查询的字段值就会根据随着LX表的指针移动进行变动,就实现了上述要求。
代码如下:
while not adotable2.eof do begin
lx1:=adotable2.fieldbyname('leixin').AsString;
lx1:=trim(lx1);
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.sql.add('select count(*) as lnfen2 from tk where t11 like ''%'+lx1+'%'' group by t11');
adoquery2.Open;
lnfen2:=adoquery2.fieldbyname('lnfen2').asinteger;
adotable2.Edit;
adotable2.fieldbyname('yti').asinteger:=lnfen2;
adotable2.Next;
end;
end;
四:问题???]
用我自己的代码很慢,很慢。在网上别人告诉我这样可以:

begin
adotable2.Open;
adotable2.edit;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.sql.Add('update f_leixin set yti=(select count(*) from tk where f_leixin.leixin=tk.t11 )');
ADOQUery2.ExecSQL;
adoquery2.sql.clear;
adoquery2.sql.add('select * from f_leixin');
adoquery2.open;
END;
但是执行不了好像ACCESS数据库不支持此SQL语句。

请高手帮我想个办法,我搞了一夜啊。!!!!!



来自:xzh2000, 时间:2003-4-30 8:36:00, ID:1816056
终于搞清楚你要做什么啦,
其实问题时将表结构的创建语法及少许测试数据贴出来大家会更乐意帮你测试

按常规猜,你的TK.tt1与f_leixin.leixin内容是一样的。

update f_leixin
set yti = (select count(*) from tk group by tt1
where f_leixin.leixin=tk.tt1)

update f_leixin
set yti=(select count(*) from tk where tk.t11 = f_leixin.leixin )

因为是ACCESS,测试性能的方法很麻烦。



来自:20082008, 时间:2003-4-30 8:47:00, ID:1816097 | 编辑
用哪一句都不行呀??

我在ACCESS里调试:
提示不能在查询数据里进行更新。

原因或者是主建冲突,
或者是锁定冲突;
或者是有效性冲突;
但是我的TK表里有ID,F-LIXIN表里我把ID删除了也不行啊。???

你帮我吧。


来自:xzh2000, 时间:2003-4-30 8:51:00, ID:1816113
那可能ACCESS就不支持这种操作,
用SQL吧。


来自:20082008, 时间:2003-4-30 8:54:00, ID:1816129 | 编辑
可是我的后台数据库用的是ACCESS数据库啊。我不想转呀

你帮帮UP以下对了怎么给你分呀。

好像ACCESS数据结果统计出来了就是不知替换的问题???
你帮帮我吧

我很急的???


来自:卜泰男, 时间:2003-4-30 9:02:00, ID:1816172
UP!


来自:20082008, 时间:2003-4-30 9:07:00, ID:1816213 | 编辑
有一个网友告诉我这样好像可以:
select a.*,(select count(*) from tk where a.leixin=tk.t11) as c from f_leixin a

但是在在某些方面F—LIXIN表新增了一个字段C,它把所有的统计结果放在C里面不能放在指定字段YTI里面呀????


来自:trf, 时间:2003-4-30 11:00:00, ID:1816834
Update 语句应该这样写:
'update f_leixin,tk set yti=(select count(tk.*) from tk where f_leixin.leixin=tk.t11)


来自:20082008, 时间:2003-4-30 11:06:00, ID:1816857 | 编辑
我用的是ACCESS数据库

update f_leixin,tk set yti='select count(tk.*) from tk where f_leixin.leixin=tk.t11'

运行不了呀。


来自:trf, 时间:2003-4-30 11:48:00, ID:1817133
对不起,写错了,应该:
'update f_leixin,tk set f_leixin.yti=(select count(tk.*) from tk where f_leixin.leixin=tk.t11)


来自:20082008, 时间:2003-4-30 11:58:00, ID:1817168 | 编辑
你再帮我试一下在ACCSSE里不能运行提示:
select count(tk.*) from tk where f_leixin.leixin=tk.t11有错误啊


来自:trf, 时间:2003-4-30 12:03:00, ID:1817195
试一下
'update f_leixin,tk set f_leixin.yti=(select count(tk.t11) from tk where f_leixin.leixin=tk.t11)


来自:20082008, 时间:2003-4-30 12:08:00, ID:1817220 | 编辑
还是不行啊是不是ACCEES不支持啊。

运行后提示不能更新查询结果呀???
大哥你帮我UP以下吧求你了。


来自:trf, 时间:2003-4-30 12:36:00, ID:1817331
对不起,应该这样,先创建一个表T1,存放满足下面条件记录:
select tk.t11,count(*) as A from tk,f_leixin on tk.t11=f_leixin.leixin
group by tk.t11
然后Update语句:
'update f_leixin,T1 set f_leixin.yti=T1.A where f_leixin.leixin=T1.t11



来自:20082008, 时间:2003-4-30 13:05:00, ID:1817424 | 编辑
第一句有问题执行不了


Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
up
Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
to firetoucher(蹈火者)
能否說清點呢﹖或舉一個例子﹐先謝了
Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
謝謝各位的幫助﹐我現一一來按你們給的方法來試試﹐如果有更好的方法請大家繼續。
謝謝了
rustle 2003-04-29
  • 打赏
  • 举报
回复
to firetoucher(蹈火者)
你先等他把try...except...end;搞清楚了再跟他讲TDBError吧...
huahanbing9 2003-04-29
  • 打赏
  • 举报
回复
同意楼上的说法。

别忘了
except
adoquery7.Cancel;//取消插入的状态
end;
firetoucher 2003-04-29
  • 打赏
  • 举报
回复
楼上不行,因为不一定只是主键重复,如果是数据错误呢?你一起抛弃了。

你可以使用TDBError对象,在返回的错误码如果是主键重复的错误码,你可以直接忽略掉,其他的只需要缺省处理(弹出出错对话框)。
关于error对象的使用你可以看看书和delphi单元,我以前做过数据库错误捕捉,没有问题的。
rustle 2003-04-29
  • 打赏
  • 举报
回复
另外

不要用Select *

用Select Count(*)

然后if Query.Fields[0].AsInteger = 0 then ....
rustle 2003-04-29
  • 打赏
  • 举报
回复
To rustle()
try
adoquery7.Post; //在運行到這個句時就出現那個異常信息,但仅仅是在调试的时候这样,直接运行程序就不报了
except
....//可以弹出对话框告诉用户,也可以暗箱操作
end;

有什么问题吗?
superhjw 2003-04-29
  • 打赏
  • 举报
回复
最好不要用了recourdcount来判断.用isempty来.
superhjw 2003-04-29
  • 打赏
  • 举报
回复
对插入操作尽量不用数据集控件,用adoDATASET或者adocommand,
SQL语句用INSERT INTO 表 values('df','d ')
try
插入数据
except
showmessage('已经存在键');
exit;
end;
liang_z 2003-04-29
  • 打赏
  • 举报
回复
没得救了,只有两种方法:
1:暗箱操作,即用Try...Except..end圈起来,不让用户看到出错消息。(不提倡)
2:在保存前先判断,你建了主键,即簇索引,我想判断速度应该很快的,因为数据库在插入记录的时候本身就要做这个判断。
3:如果你的数据库是大型数据库的话,还有一种方法是用存储过程。
Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
To rustle()
try
adoquery7.Post; //在運行到這個句時就出現那個異常信息
except
....//可以弹出对话框告诉用户,也可以暗箱操作
end;

有什么问题吗?


rustle 2003-04-29
  • 打赏
  • 举报
回复
try
adoquery7.Post;
except
....//可以弹出对话框告诉用户,也可以暗箱操作
end;

有什么问题吗?
Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
up
Ivanwxr 2003-04-29
  • 打赏
  • 举报
回复
也許大家還沒有看我的問題﹔
我開始的程序是這樣的﹕
adoquery8.Active:=false;
adoquery8.SQL.Text:='select * from mealtraces where emp_no='+''''+ trim(strid) +''''+' and convert(varchar(19),tt_time,21)='+''''+ sktime+''''+' and addr_no='+targetaddr;
adoquery8.Active:=true;
if adoquery8.RecordCount=0 then
begin
if not adoquery7.Active then
adoquery7.Open;
adoquery7.Insert;
adoquery7.FieldByName('EMP_NO').AsString:= trim(strID);
adoquery7.FieldByName('TT_TIME').AsString:=sktime;
adoquery7.FieldByName('Orig_time').AsString:=sktime;
adoquery7.FieldByName('ADDR_NO').Value:=targetaddr;
adoquery7.Post;
end;

后來發現這判斷速度太慢了﹐就在改表mealtraces的結構﹐既對字段emp_no,tt_time,addr_no設為主鍵﹐再把上面用來判斷的語句主釋了﹐既變成這樣了:
if not adoquery7.Active then
adoquery7.Open;
adoquery7.Insert;
adoquery7.FieldByName('EMP_NO').AsString:= trim(strID);
adoquery7.FieldByName('TT_TIME').AsString:=sktime;
adoquery7.FieldByName('Orig_time').AsString:=sktime;
adoquery7.FieldByName('ADDR_NO').Value:=targetaddr;
adoquery7.Post;
在這種情況下出那個關于主鍵的異常。我不知道說明白了沒有﹕(

tyh800220 2003-04-29
  • 打赏
  • 举报
回复
那就用
try
except
end;
象rustle() 说的一样捕获这个异常,再showmessage。
rustle 2003-04-29
  • 打赏
  • 举报
回复
捕捉这个一场报告给用户好了...
tpmao 2003-04-29
  • 打赏
  • 举报
回复
UP!!!!!
加载更多回复(4)

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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