El método de procesamiento en el campo ClientDataSet auto-creciente de Firebird bajo el marco MIDAS

Aunque Delphi ha introducido recientemente un marco de base de datos multinivel entre redes en modo DataSnap, todavía me gusta el marco de base de datos multinivel original basado en MIDAS. Si desea ejecutar en Internet, prefiero usar MIDAS bajo la arquitectura WebService, por lo que se escribe menos código.

En el título.

Bajo el marco MIDAS, la estructura desde la base de datos hasta el cliente es la siguiente:

 

1. FDConnection1 se conecta a la base de datos;

2. FDQuery1 ejecuta la instrucción select para obtener datos de la tabla;

3. DataSetProvider1 se conecta a FDQuery1

4. ClientDataSet1 obtiene datos de DataSetProvider1;

5. Firebird tiene un generador para generar un nuevo número de secuencia, escriba un procedimiento almacenado para obtener este número del generador;

5.1 FDStoredProc1 ejecuta este procedimiento almacenado para que el programa del lado del servidor pueda obtener este número;

 

En el lado del cliente, al agregar un nuevo registro, no es necesario conocer el valor numérico de incremento automático de esta base de datos.

1. En el evento AfterInsert de ClientDataSet1, use el código para completar el número negativo como sustituto (por lo general, se debe completar el campo de incremento automático, por lo que el número debe completarse, porque el cliente no sabe cuál será el número después de que el servidor de la base de datos realmente inserte el registro );

procedure TForm1.ClientDataSet1AfterInsert(DataSet: TDataSet);
begin
  ClientDataSet1.Tag := ClientDataSet1.Tag -1;    //用 tag 来存储本地临时负数编号

  with ClientDataSet1 do
  begin
    FieldByName('EMP_NO').AsInteger := ClientDataSet1.Tag;
  end;
end;

 

2. Importante: establezca poPropogateChanges en DataSetProvider1.Options en True, que es False de forma predeterminada. Con esta configuración, después de modificar el registro en el lado del servidor, se retroalimentará automáticamente a ClientDataSet1 sin escribir código.

 

3. Escriba el código en el evento BeforeUpdateRecord de DataSetProvider1 para cambiar el número negativo al número correcto de incremento automático obtenido de la base de datos:

procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
begin
    //这里把提交过来的记录,如果是新增的记录,从数据库获得自增,替换掉
  case UpdateKind of
    ukModify: ;

    ukInsert:
    begin
      DeltaDS.Edit;
      DeltaDS.FieldByName('EMP_NO').NewValue := Self.GetEMPNo;
    end;

    ukDelete: ;
  end;
end;

 

4. Entre ellos, Self.GetEMPNo; es el número auto-creciente generado por el generador que usa el procedimiento almacenado para obtener la base de datos:

function TForm1.GetEMPNo: Integer;
begin
  FDStoredProc1.ExecProc;
  Result := FDStoredProc1.Params[0].AsInteger;
end;

para resumir:

El punto es establecer poPropogateChanges en DataSetProvider1.Options en True. De esta forma, después de modificar los datos en el lado del servidor, se pueden reflejar en el cliente inmediatamente sin escribir código, sin tener que ejecutar ClientDataSet1.Refresh.

Supongo que te gusta

Origin blog.csdn.net/pcplayer/article/details/108487231
Recomendado
Clasificación