数据集取消或中止(正确的方法)?

时间:2015-07-14 00:36:58

标签: delphi

如果我只调用abort,那么我的数据集仍处于dsedit状态。 我必须按两次ESC或点击取消按钮(dbnavigator)退出。

我无法调用取消,因为我的表格未处于编辑模式(错误)。

这样:

procedure TDataModule.MYTABLEBeforePost(DataSet: TDataSet);
begin
with VALIDATE_ENTRY do begin
VALIDATE_ENTRY.Close;
VALIDATE_ENTRY.SQL.Clear;
VALIDATE_ENTRY.SQL.Text := 'SELECT [NAME] FROM UNITS WHERE [NAME] = '+ QuotedStr(UNITS.FieldByName('NAME').asString) ; 
VALIDATE_ENTRY.Open;
if EOF then begin
MYTABLE.Post;
end else
ShowMessage('NAME '+UNITS.FieldByName('NAME').asString+' already exists !'+#13#10+'Entry is forbidden !');
Dataset.Cancel;
Abort;
end;
end;

似乎有效,但确实感觉很奇怪。

这可以使用,还是有另一种优雅的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

只需致电Dataset.Cancel即可。这会让你回到浏览模式。呼叫中止将使您处于dsEdit状态。允许编辑不要调用任何东西。

答案 1 :(得分:1)

我不同意以前的回答。取消将导致已输入的数据丢失。想象一下,您的用户输入了DOZENS字段,只是因为他/她键入了错误信息,他/她是否有义务再次输入?这不是软件应该如何工作的。 如果软件用户做错了什么,保留他的工作并让他有机会纠正并再次发布。这是代替DataSet.Cancel的异常。

另外,你的模式:

ShowMessage('NAME '+UNITS.FieldByName('NAME').asString+' already exists !'+#13#10+'Entry is forbidden !');
Abort;

错误的IMO。你应该使用:

raise Exception.Create('your error message here');

甚至更好,创建自己的Exception后代并将其提升,例如:

raise EYourDBExceptionClass.Create('your error message here');