ADO主键冲突,怎样检测较好?(200分)

  • 主题发起人 主题发起人 xfei
  • 开始时间 开始时间
X

xfei

Unregistered / Unconfirmed
GUEST, unregistred user!
使用ADO时发生主键冲突(primary key),用ADOQuery
1.Append->post时在 OnPostError中检测Connection.Error.Number能获得,但不同的系统
(主要是ado引擎,如win98 or 2000)时,Number好像不一样,怎么办?有Number的对照表吗?
2.写SQL增加数据('Insert into xxx...'),OnPostError中检测不到错误,只能在
try
execsql;
except
on EOleError do
end
可是,只检测EOleError,不知道是什么错误啊,怎么办?
请高手赐教!!!
 
如果仅仅是主键冲突就容易了,在Insert之前加执行一次select * from xx where 键名=键值,
有没有这个键值就清楚了,如果已经有这个值就拒绝登入。
 
这方法我原来就用,可是表中记录多了就很慢了。
既然ado检测到了错误(后台的数据库也搜索了重复值了,何必再搜那),我们应该利用它啊。
 
既然你已经知道是主键冲突,那就弹个messagebox告诉用户,然后ado控件cancel掉就行了呀
 
我是在IDE里检测到的啊!!!!!!!怎样在Exe里拦截啊?????
 
在数据集的OnPostError,OnDeleteError中处理
方法1:ADOConnection.Errors
方法2:E: EDatabaseError
sample:
if AnsiPos(主键名,E.Message)>0 then
E.Message('您输入重复的****';
ShowMessage('数据递交错误:'+E.Message);
Action:=aAbort;
如果Excutesql检测不到,试试检测一下数据集的RowsAffected

 
lynu: OnDeleteError中检测什么,我好像没有拦截住什么啊。
E.Message检测可靠吗?我的操作系统或ado是英文的,怎么办?还是应该用错误号吧!
唉,delphi的程序员就是惨,底层的东西知道太少了,我可能要放弃它了!!!
估计没有纯delphi程序员研究过ADO吧?SDK就不要说了!
 
你在设计数据库时为什么要允许主键重复呢?在程序里拦截不是解决问题的根本方法呀,更正数据库吧……
 
faint,我当然知道不能重复了!可是用户会输入重复值啊!!!唉,我在大富翁上搜了很久了,
看来我解决不了了
 

首先我不明白为什么你要让用户写主索引
这种做法不可取,这是程序员的事

其次如果你一定要这样做
其实也简单,设定你的表为A,另外做一张表B
NAME TYPE
NO int (主索引)
NUM INT (记录最大值)
其中NUM这个值在你POST数据以前读一下你的最后一条记录
A。NO的值
POST当中你加入把该值变为A。NO+1
POST以后你把A。NO赋给B。NO
相当于保存最后记录的A。NO 的值
这么做就是把服务器的自增工作用自己写代码的方式完成
仅提供参考



 
ADOExpress就是包装了一下ADO Activex对象,ADO COM对象能做到的用ADOExpress也
基本上可以做到
想要完全保证用户不会尝试去输入重复值是不可能的,后台数据库随时可能添加新记录的,
除非你确实是个单机版.保证没有第二个用户在同一时刻操作数据库.这样的话倒可以在操作
前检测是否存在同样的值.
E.Message中检测主键名是可靠的,不论中英文版都行.至少对ADO+OLEDB+SQLServer还是可以
的.


 
同意! 来自:lynu, 时间:2002-8-12 10:12:00, ID:1258487

这是现代数据库思想!!给点分吧!!我的分不多了!!
 
to wyismail:不让用户改主索引?其它索引呢?另一张表?写表时死机了呢?锁表了?......
to lynu:谢谢你的回答.可我还有很多副索引啊,返回的都是IX_xxxx,没有主键(副键)名啊。
我的原意是,我认为ado应该返回给一些特定的值啊,象bde.如Error.Number=xxxx,表示主键冲突
, Error.Number=xxx表示记录更新了等等....,可是Error.Number并没有返回特定的值,我在
不同的操作系统和环境下,得到的值不一样啊。有人研究过delphi是怎样封装ado的吗?
期待大家的回答。难道大家平时没有碰到这个问题吗?
 
建库时加一个自动计算字段作为主键。此字段随数据库增、删自动增减,无须代码维护。
 
如果录入时使用了缓存呢? 如何判断录入的数据与表中的记录有重复的呢?
 
这个,基本上很难!
 
在错误事件冲处理
 
OnPostError 對SQL SERVER處理的很好,我在開發中就使用該項功能,對ACCESS不知處理的如何,請試試, 就象lynu所講,但SQL 2000與SQL 7偉回的值不一樣。
 

Similar threads

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