zoukankan      html  css  js  c++  java
  • ClientDataSet控件ApplyUpdates的异常触发

    在使用ClientDataSet控件时,在关联的TDBGrid控件插入不合法的字段,再执行ClientDataSet的ApplyUpdates方法,数据插入失败

    但在客户端没有报异常,try...except...end 无法捕捉到。

    在网上找到了几种解决方法

    第一种是在中间服务层的DataSetProvider控件中加入OnUpdateError事件

    在事件中加入如下代码:

    procedure TSvrProb.DataSetProvider1UpdateError(Sender: TObject;
      DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
      var Response: TResolverResponse);
    begin
      raise E;  // 就是这一行代码
    end;

    客户端程序的ClientDataSet控件的方法就能在try...except...end就能正常触发异常了。

    ClientDataSet1.ApplyUpdates(MaxErrors)

    ApplyUpdates方法接受一个整数类型的参数,MaxErrors。MaxErrors代表当TDataSetProvider自动更新数据时,程序员所允许发生的错误次数。如果ApplyUpdates在更新数据时发生了超过MaxErrors指定的数量的错误,那么这整个更新动作便会被回滚。相反的如果发生的次数小于或是等于MaxErrors,那么成功更新的数据仍然会被更新到数据源中,至于没有成功更新的数据则可以让程序员通过错误事件处理函数来决定如何处理这些失败的数据。通常传递给ApplyUpdates方法的MaxErrors参数是0,代表不允许发生任何更新错误。或是传递-1,代表不管发生多少错误都没有关系,先把能够成功更新的数据更新回数据源中。

    第二种看起来比较复杂 ,我没试过,方法是在公共单元中放入一个ApplicationEvent控件

    在ApplicationEvent控件加入OnException事件

    贴上网上找到的具体代码:

    procedure TClient_RDataForm.ApplicationEvents1Exception(Sender: TObject;
    E: Exception);
    begin
      if (E is ESocketConnectionError) or (E is ESocketError) then
    begin
      if not Is_OK then
      begin
        Application.MessageBox(PChar('考试应用服务器或网络连接失败!请退出后重新启动考试系统! '),
          '服务器连接中断', MB_OK + MB_ICONERROR);
        Application.Terminate;
        Exit;
      end;<br>
      while not ReConnect_Srv do //重新连接又失败了
      begin
        if Application.MessageBox(PChar('考试服务器或网络连接失败!请立即与监考老师联系! 
           '+#13+'要重新搜索服务器请按[是],强制退出请按[否]! '),
              '服务器连接失败', MB_YESNO + MB_ICONSTOP) <> IDYES then
        if (Application.MessageBox('真的要强制退出考试系统吗?  ','强制退出确认', MB_YESNO +
            MB_ICONWARNING + MB_DEFBUTTON2) = IDYES) then
        begin
          Application.Terminate;
          Exit;
        end;
      end;<br>
      if MyConnection.Connected then
      begin
        Application.MessageBox('考试应用服务器恢复连接成功!','连接成
          功',MB_OK+MB_ICONINFORMATION);
        Exit;
      end;
    end else
      raise Exception.Create('考试系统发生异常错误!退出后请重新启动考试系统继续考试!');
      //ShowMessage(e.Message);

     错码太长了,不过我大致看了一下,跟第一种方法对比,我还是比较中意第一种方法

    第一种方法能随时捕捉到ClientDataSet中的异常,而ApplicationEvent却要在一个过程中捕捉所有异常,不如第一种方法方便

    文章转截自:https://www.cnblogs.com/skyblue-Mr/archive/2013/03/15/2961859.html

  • 相关阅读:
    2018-2019-1 20165321 20165324 20165302 实验四 外设驱动程序设计
    2018-2019-1 20165324 20165302 20165321 《信息安全系统设计基础》 第三次实验
    2018-2019-1 20165321 《信息安全系统设计基础》第七周学习总结
    2018-2019-1 20165321 《信息安全系统设计基础》第六周学习总结
    20165321 20165302 02165324 实验二 固件程序设计
    2018-2019-1 20165321 《信息安全系统设计基础》第五周学习总结
    2018-2019-1 20165302 20165321 20165324 实验一 开发环境的熟悉
    2018-2019-1 201653121 《信息安全系统设计基础》第三周学习总结
    2017-2018-2 20179205 《网络攻防技术与实践》第四周学习
    2017-2018-2 20179205《网络攻防技术与实践》第三周学习
  • 原文地址:https://www.cnblogs.com/approx/p/12671241.html
Copyright © 2011-2022 走看看