请各位高手给我指点一下POST方法的执行过程.我是指在执行了.ADOQUERY1.POST方法后.系统都调用了那些事件,执行了哪些操作.我在BEFOREPOST事件中写了一句代码.ABORT.目的是想拦截系统的任何POST异常.然后在TRY EXCEPT 语句中进行判断.可是程序现在连正常的保存都不成功.可是如果去掉ABORT的话,一切正常.不知道这是为什么,请各位指点.代码大致如下.
procedure buttonPOSTclick(sender:tobject)
begin
try
adoquery1.post;
showmessage('保存成功');
except
showmessage('保存失败');
end;
end;
procedure beforpost(sender:tobject)
begin
abort;//为了拦截系统的异常消息.
end;
procedure buttonPOSTclick(sender:tobject)
begin
try
adoquery1.post;
showmessage('保存成功');
except
showmessage('保存失败');
end;
end;
procedure beforpost(sender:tobject)
begin
abort;//为了拦截系统的异常消息.
end;
beforepost中的事件可以对诸如主键重复的不给post
在保存前被你停止了,当然无法保存
你上面那个就可以了
事件顺序:BEFORPOST----》系统内部调用----》AFTERPOST。
还有就是。我们在程序中写的POST按扭虽然可以对POST事件进行异常处理。但是当光标移动到其他记录时,引起系统调用的话。这样的异常我们是无法控制的。要实现控制该怎么办呢?
begin
try
adoquery1.post;
showmessage('保存成功');
except
showmessage('保存失败');
//这里写出错的代码。
end;
end;
procedure beforpost(sender:tobject) //这个函数不要,去掉。
begin
abort;//老大,这里出错!
end;
我的代码如下。
procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
begin
////////对不能为空的外键值进行检查BEGIN//acceptance_type_id
if adoquery1.FieldByName('acceptance_type_id').asstring='' then
begin
showmessage('acceptance_type_id不允许为空!');
adoquery1.FieldByName('acceptance_type_id').focuscontrol;
abort;
end;
end;
procedure TForm1.POSTBUTTONClick(Sender: TObject);
begin
if adoquery1.active=false then
begin
showmessage('数据库未打开,不能保存修改!');
end
else
begin
if not (adoquery1.State in [dsedit,dsinsert]) then
begin
showmessage('数据库处于浏览状态,不能保存修改!');
end
else
begin
try
adoquery1.Post;
showmessage('您的修改已保存!');
except
//输入数据的完整性在BEFORPOST事件中进行检查.
//在这里主要检查输入的外键值是否符合参照完整性规则.
showmessage('保存数据失败!,请检查输入数据的完整性和合法性');
adoquery1.Fields[1].focuscontrol;
end;
end;
end;
在保存前被你停止了,当然无法保存
保存之前中止,当然不行!
1 TAdoQuery.Post. //TDataSet.Post 实现
1.1 TDataSet.DoBeforePost //用来触发OnBeforePost,
1.2 TCustomADODataSet.InternalPost
1.2.1 TCustomADODataSet.InternalPost.UpdateData
1.2.1.1 Recordset.Update //这儿调用到ADO接口的方法。
1.3 TDataSet.DoAfterPost //用来触发OnAfterPost
楼主你在1.1那处使用ABORT抛出异常,就跳出了下面的流程,当然不会再调用到POST实现上去.
TCustomDBGrid.MouseDown
TDataLink.MoveBy
TDataSet.MoveBy
TDataSet.CheckBrowseMode
TDataSet.Post. //
TDataSet.DoBeforePost //用来触发OnBeforePost
TCustomADODataSet.InternalPost
TCustomADODataSet.InternalPost.UpdateData
Recordset.Update //这儿调用到ADO接口的方法。
TDataSet.DoAfterPost //用来触发OnAfterPost
无论你是调用POST方法,还是使用DBGRID,都是差不多的。
都是从TDATASET。POST开始执行