如何在录入阶段控制某一列不重复(100分)

  • 主题发起人 主题发起人 xgydelphi
  • 开始时间 开始时间
写一个存储过程来判断。
............
if instered.columnname not in (select column from table) then
commit
...........
 
VAR TEMPSTRINGS:TSTRINGLIST;
。。

ON QUERY1 OPEN

WITH QUERY1 DO BEGIN
TEMPSTRING。CLEAR;
FIRST;
WHILE NOT EOF DO BEGIN
TEMPSTRINGS。ADD(FIELDBYNAME(’A‘)。ASSTRING;
NEXT;
END;
END;

ON VALIDATE
。。
WITH QUERY1 DO BEGIN
IF TEMPSTRING。INDEXOF(FIELDBYNAME(‘A’)。ASSTRING) >0 THEN
RAISE EXCEPTION。CREATE(‘ERROR 。。。’)
ELSE
TEMPSTRING。ADD(FIELDBYNAME(‘A’)。ASSTRING);
END;

AFTER
 
你无法在前台处理,SQL是个并行系统,即使你在1秒钟前还得到一个无重复的值,
你也无法保证你POST时是否有重复,故只能让服务器去处理,自己用异常处理来
控制!
我也是深受其苦啊!
有没有人想将DELPHI的异常处理进行汉化啊?
有兴趣者请EMAIL: haime@263.net,我们来合作好不好?因为其文件太长了,只怕
二三个月也做不完!
 
可以截获delphi的所有异常,只要在program中继承一个异常类,
并将之实例化,即可建立自己的异常类。
//建立自己的异常处理类,从Exception继承。
Type
TGlobalExHandler=class
public
procedure HandlerProc(Sender:TObject;Einstance:Exception);
end;
// 重载处理函数
Procedure TGlobalExHandler.HandlerProc(Sender:TObject;Einstance:Exception);
begin
//用pos方法查找错误信息串中有无该错误;pos返回其位置,如大于0,表示有。
if pos('UNIQUE KEY',Einstance.Message)>0 then
Application.MessageBox('索引重复!',pChar('学生管理信息系统'),1);
if pos('OPERATOR',Einstance.Message)>0 then
Application.MessageBox('密码错误,请重新输入!',pChar('学生管理信息系统'),1);
end;

var
GlobalExHandler:TGlobalExHandler;

begin
// GlobalExHandler:=TGlobalExHandler.Create;//实例化
//将项目的异常处理指向自己的错误处理类的句柄
// Application.OnException:=GlobalExHandler.HandlerProc;
(下略)
End;
 
这种情况最好由服务器来处理,将该字段定为Unique,写SP。
 
在数据库变化时对Table1加入一个Beforepost事件,程序如下:
procedure TForm1.Table1
BeforePost(DataSet: TDataSet);
begin
with table2 do
begin
databasename:=;
tablename:=;
if not active then open; {判断数据库是否打开}
Refresh; {刷新数据库}
setkey; {设置数据库为搜索状态}
fieldbyname().asstring:=column;
{设置输入的字段内容为搜索的标准}
gotokey;
{移动到搜寻的记录上,完成搜索}
if gotokey then
{如果找到搜索的记录,则gotokey返回true}
begin
showmessage('输入的已存在!请重新输入');
abort; {终止该操作}
end;
end;
end;
 
hehe
大家好空呀,自己做代码效率低,用唯一索引
不要告诉我没有,如果没有就建
CREATE INDEX....UNIQUE
 
谁告诉我该怎么分?
 
SEASKY,难道抽奖?
 
多人接受答案了。
 
后退
顶部