本人用delphi5+BDE+sql server2k+borland socket開發三層的應用系統。
應用服務器端使用普通的master-detail主從關系連接表﹐使用TDataSetProvider,屬性設置如下﹕
[poCascadeDeletes,poCascadeUpdates,poAutoRefresh,poAllowCommandText]   在服務器端的Query控件和TDatasetProvider控件的UpdateError事件過程中設置錯誤處理代碼如下﹕
procedure UpdateError(Sender: TObject;
  DataSet: TClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
var EDBError: EDBEngineError;
begin
  try
  if E.ErrorCode <> 0 then
    if (E.OriginalException is EDBEngineError) then
    begin
      EDBError := (E.OriginalException as EDBEngineError);
      if UpdateKind = ukInsert then Response := RrAbort;
      if UpdateKind = ukModify then Response := RrSkip;
      if UpdateKind = ukDelete then Response := RrIgnore;
    end
    else
      Response := RrAbort;
  except
  end;
end;   問題﹕
   1.當客戶端用tclientdataset提交數據時﹐若有錯誤出現﹐在上述過程中設置斷點﹐根本就沒有觸發事件。不知我的做法有何不妥﹐請指教。
   2.當客戶端有如下操作時﹐應用服務器會異常關閉(嚴重﹐所有客戶端應用都被中斷):
   在一個主表記錄中﹐主鍵keyvalue='A102',明細記錄存在多條如下﹕
     主鍵值    客戶編號    客戶名稱
a.   200310    C102       匯創
----------------------------------
b.   200310    C103       科源
   ...   其中﹐主鍵值+客戶編號為組合關鍵字。
   在刪除b記錄后(主表未提交)﹐再增加一條記錄,內容的與被刪除的b記錄完全一樣﹐此時提交主表applyupdates(-1)。將會導致應用服務器常時間沒法反應﹐或應用服務器程序出錯誤并退出。    請有高手指點﹐如何才能正確地在應用服務器中處理異常。
    另﹕請高手們提出開發應用服務器中你自己的開發方法。
    暫時只能送100分﹐不足的另開一貼給分。

解决方案 »

  1.   

    請有高手指點﹐如何才能正確地在應用服務器中處理異常??
    一般来说你没有必要在服务器端处理异常,你可以在客户端写一个统一的ONERROR事件,动态指给在招待更新动作的CDS;让他来处理;因为你的applyupdates(-1)参数是-1所以所有错误都应该拿给客户端;在刪除b記錄后(主表未提交)﹐再增加一條記錄,內容的與被刪除的b記錄完全一樣﹐此時提交主表applyupdates(-1)。將會導致應用服務器常時間沒法反應﹐或應用服務器程序出錯誤并退出?
    你的后端如果是SQL-SERVER,有中能会产生交易锁死;你应该把表提交后再执行,如果需要交易建议成批SQL;D的MIDAS在提交更改时,D5不能完全将PROVIDERFLAG传来服务器,必须自己实现(估计是BUG,也可能是我看错了),最要自己在中间层来实现数据提交;通常的提交定位都是用KEY
    但MIDAS默认用WHEREALL。这样很容易产生并发错误;希望对你有所帮助;