dbgrideh 提交时数据不能重复(100)

  • 主题发起人 主题发起人 漂流的雲
  • 开始时间 开始时间

漂流的雲

Unregistered / Unconfirmed
GUEST, unregistred user!
数据表有设置主建A,B,C字段,现Dbgrideh 中的C列+D列+E列这三例的值不允许重复。如A   B C D E F101 001 1 20090201 A 1101 001 2 20090201 A 2101 001 3 20090201 A 2 //这条重复, 在提交时判断,在Afterpost不会写处理代码,望大伙给个例子。先谢谢了
 
在数据库中设为唯一
 
楼上正解,保存的时候 加异常处理!苯点的做法就是保存前 beginpost 去查询数据库 如果有就异常。
 
除了设置主建外,用程序来控制做不到吗
 
在beforepost前检查。procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);var sql:String;begin if DataSet.State=dsEdit then exit; //数据编辑的情况下不必判断 sql:=format('Select count(*) from table1 where c=%d and d=%d and e=''%s'' ', [DataSet.fieldbyname('c').asinteger, DataSet.fieldbyname('d').asinteger, DataSet.fieldbyname('e').asstring ]; query_Temp.close; query_Temp.sql.text:=sql; query_Temp.open; if query_Temp.fields[0].asinteger>0 then begin Showmessage('重复'); abort; //终止继续保存 end;end;
 
MB05:=ADOQuery2.FieldValues['MB005'];MB07:=ADOQuery2.FieldValues['MB007'];if ADOQuery2.locate('MB005;MB007',VarArrayOf([MB05,MB07]),[]) thenbegin showmessage('数据重复'); abort;end;这样还是不行,难得一定要在保存前查询一次,这样效果太差了
 
LOCAL和后台Select查询,两者效率相差很大。Local虽然是内存操作,但它会把所有数据从数据库查询到本地内存,然后在进行定位的,况且你也不能保证在你新增的时候,可能别人在其它机器也新增了同样的数据,所以必须到后台查询。你这3个字段应该是主键或者建立唯一索引,效率应该不差。
 
用唯一索引解决了,谢谢
 
多人接受答案了。
 

Similar threads

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