⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dserver.pas

📁 《Delphi开发人员指南》配书原码
💻 PAS
字号:
unit dServer;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables, Db, Provider, DbClient, Bde
  {$IFNDEF VER130}, BdeProv{$ENDIF};

type
  TdmServer = class(TDataModule)
    prvMaster: TProvider;
    qryMaster: TQuery;
    qryMasterCUSTNO: TFloatField;
    qryMasterCOMPANY: TStringField;
    qryMasterADDR1: TStringField;
    qryMasterADDR2: TStringField;
    qryMasterCITY: TStringField;
    qryMasterSTATE: TStringField;
    qryMasterZIP: TStringField;
    qryMasterCOUNTRY: TStringField;
    qryMasterPHONE: TStringField;
    qryMasterFAX: TStringField;
    qryMasterTAXRATE: TFloatField;
    qryMasterCONTACT: TStringField;
    qryMasterLASTINVOICEDATE: TDateTimeField;
    Database: TDatabase;
    prvDetail: TProvider;
    qryDetail: TQuery;
    qryDeleteItems: TQuery;
    procedure prvDetailUpdateError(Sender: TObject;
      DataSet: TClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
      var Response: TResolverResponse);
    procedure prvMasterUpdateError(Sender: TObject;
      DataSet: TClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
      var Response: TResolverResponse);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  dmServer: TdmServer;

implementation

{$R *.DFM}

{This is one way to handle referential integrity. When applying an update that}
{would trigger an RI violation, this event gets fired. We can evaluate what}
{caused the error (Insert, Update, Delete) and take appropriate action.}
{You could also specify cascading deletes on the database tables.}
procedure TdmServer.prvDetailUpdateError(Sender: TObject;
  DataSet: TClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  {Paradox returns a different error than SQL DBs}
  if (UpdateKind=ukDelete) then
    if (E.ErrorCode=DBIERR_FORIEGNKEYERR) or
       (E.ErrorCode=DBIERR_KEYVIOL) or
       (E.ErrorCode=DBIERR_OPTRECLOCKFAILED) then
  begin
     qryDeleteItems.Params[0].Value:=Dataset.Fieldbyname('OrderNo').OldValue;
     qryDeleteItems.ExecSQL;
     if qryDeleteItems.RowsAffected>0 then
       Response:=rrApply;
  end;
end;

procedure TdmServer.prvMasterUpdateError(Sender: TObject;
  DataSet: TClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
  var Response: TResolverResponse);
begin
  if UpdateKind=ukDelete then begin
    ShowMessage('This demo does not support more than one level of cascading delete.'+#13#10+
                'Please manually de lete the orders for CustNo '+Dataset.FieldbyName('Custno').AsString+'.');
    Response:=rrIgnore;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -