📄 dserver.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 + -