欢迎大家来谈谈在做数据库系统时,如何更好的做到数据库完整性? (DELPHI异常捕捉???) (200分)

  • 主题发起人 主题发起人 KeepObject
  • 开始时间 开始时间
K

KeepObject

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。[:D]
例如有一个职员表,主键为职员ID。另外有好几个表的外键引用了此职员表的职员ID。那现
在若用户要删除此职员ID,您的程序或数据表规则是如何设计的呢?
欢迎大家介绍自己的成功经验或体会。谢谢!
QQ:9844389
 
on update case
on delete case
在定义外码的时候加上,这样修改外码,其他的跟着修改,删除的时候跟着删除
 
不要级联的
 
那就建立触发
 
给个例子…
 
方法一: 数据库设计上用触发器、主键/外键, 这种方法效率高(都在数据库端执行),但
与软件/用户的交换就不好处理(例如主键重复错误,要程序判断出该错误类型,
才可以在界面上提示用户;
方法二: 程序设计上,在各种操作提交前通过查询等,自行判断用户操作的合法性,好处是比较
灵活,但比较烦(要比较全面的预测出用户的各种操作,少一个软件就有bug),另一个
不好就是效率低,都是客户端操作,很多select等语句,会增加服务器的负担
(一个解决方法是把这些业务逻辑都转移到中间层)
 
我现在用第一种,怎么铺捉详细错误信息啊。ADO的错误铺捉真是搞不懂 [:(]
 
用存储过程来实现,我认为用存储过程来做一般的MIS应用是非常好!速度很快,编程也方便!
 
hpretty:触发器也是一种特殊的存储过程
 
建议根据用户的具体逻辑,自己写代码来实现。不用数据库本身的约束。
你想一下,级联删除并不一定是用户需要的。比如现在要删除一个员工,而他在其他表中
的历史记录也许是用户要求必须保留的。你难道也要一删了之吗?这时,你就不能简单地
使用触发器等,只有根据用户的要求自己写代码即能维护完整性,还能满足用户的逻辑。
 
这个我也想过,但我用外键约束岂不是更好.关键是DELPHI中的数据库错误异常捕捉能不能做
得更好.
就像HHSH兄说的如果我删除某一职员记录别的引用了此职员的表就不能删除,但DELPHI会提
示出错,那DELPHI应怎么做才能知道是"外键约束出错"??
 
使用触发器和数据库事务
 
拦错误:
if (E is EDBEngineError) then
with (E as EDBEngineError)do
begin
iDBIError :=Errors[0].Errorcode;
case iDBIError of
9732: MessageDlg('必输字段不能为空', mtWarning, [mbOK], 0);
9729: MessageDlg('键值重复', mtWarning,[mbOK], 0);
9733: MessageDlg('主数据丢失', mtWarning,[mbOK],0);
9734: MessageDlg('主表已有明细,不能删除或修改',mtWarning, [mbOK], 0);
10000: MessageDlg('不正确的数据类型',mtWarning, [mbOK], 0);
10024: MessageDlg('数据表不存在',mtWarning, [mbOK], 0);
13059: //SQL语句错误
begin
iSQLError:=Errors[0].NativeError;
if ErrorCount>=1 then
MessageDlg(Errors[1].Message,mtWarning, [mbOK], 0);
end;
13060: MessageDlg('数据表已存在',mtWarning, [mbOK], 0);
end;
end;

还有其它代码:记得以前有一个BDE错误信息的!慢慢汉化去吧!
 
呵呵呵,谢谢vmao兄,我要ADO的啊!!! [^]
 
to vmao:good!
用存储过程!
 
>比如现在要删除一个员工,而他在其他表中
>的历史记录也许是用户要求必须保留的。你难道也要一删了之吗
一般来说客户只会删除测试和无用(输入错误等)不会把真正的员工删除的,
即使员工调离、死亡、退休,一般都是设置一个标志来确定。
》呵呵呵,谢谢vmao兄,我要ADO的啊!!! [^]
这里有个ado的:
procedure Tmainform.ADOConnection1ConnectComplete(
Connection: TADOConnection;
const Error: Error;
var EventStatus: TEventStatus);
var
orastr: string;
connectionstr:string;
begin
if error <> nil then
begin
orastr := copy(error.Description, 1, 9);
if firstrun then
if (orastr = 'ORA-12154') or (orastr = 'ORA-01017') or (
copy(orastr,1,3)<>'ORA') then
begin
if questionBox('数据库配置出错!'+#13+'是否重新配置')= idok then
begin
 
jianl,很感兴趣! 关于数据库端的异常在此事件中能够捕获并提示出来吗? 比如主键重复
外键约束错误等.异常号又是多少呢? (假如是MS SQL SERVER)
[:D]
 
没有用过ado+sqlserver,可以肯定所有的ado错误都会在这里出现,应为做ado研究的小伙子
原来用的就是sqlserver。
异常号我们也是碰到一个记录一个,太原始了。
 
我看到SQL SERVER中的Mater系统表SysMessage有错误的信息,不知那个是不是数据库要返回
的异常号........
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部