共享一个函数
//==============================================================================
//数据安全保存******************************************************************
//==============================================================================
function Data_SafeSave(DataSet: TDataSet; WinControl: TWinControl): Boolean;
begin
  Result := false;
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //TDBDataSet是TQuery,TTable,TStoredProc的直接父类(两层结构)*******************
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  if (DataSet is TDBDataSet) then
  begin
    if (DataSet as TDBDataSet).Database.InTransaction then (DataSet as TDBDataSet).Database.Rollback;
    (DataSet as TDBDataSet).Database.StartTransaction;//开始提交一个事务
    try
      (DataSet as TDBDataSet).ApplyUpdates;//把缓存中未决的记录写到数据集中
      (DataSet as TDBDataSet).Database.Commit;//把调用StartTransaction以来所有的数据变化都反映到服务器上,与Query_Main.Database.Rollback相反
      Result := true;
    except
      (DataSet as TDBDataSet).CancelUpdates;
      (DataSet as TDBDataSet).Database.Rollback;//把调用StartTransaction以来所有的数据变化都取消,与Query_Main.Database.Commit相反
      if WinControl<>nil then WinControl.SetFocus;
      Result := false;
      Abort;
    end;
    (DataSet as TDBDataSet).CommitUpdates;
  end
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //TClientDataSet远程更新(三层结构)********************************************
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  else if (DataSet is TClientDataSet) then
  begin
    if (DataSet as TClientDataSet).ApplyUpdates(0)=0 then
    begin
      Result := true;
    end else
    begin
      if WinControl<>nil then WinControl.SetFocus;
      Result := false;
      Abort;
    end;
  end;
end;