DataSetProvider - DataSet到ClientDataSet

时间:2010-03-30 20:30:29

标签: delphi data-structures tclientdataset

编辑:似乎DataSetProvider没有这个项目所需的功能,所以我将实现一个自定义类,用于将数据加载到ClientDataSet中。

我正在尝试从连接到我的数据库的TMSQuery获取数据,并使用DataSetProvider使用一些数据填充ClientDataSet。

我的问题是我需要修改一些这些数据才能进入我的ClientDataSet。 ClientDataSet具有与原始DB数据不匹配的持久字段。我甚至无法从DB中获取ClientDataSet中的备注字段。

ClientDataSet是我的数据层的一部分,因此我需要按字段将数据从数据库符合到ClientDataSet字段(大多数将能够直接通过,但许多将需要路由和/或转换)

有没有人有这方面的经验?

3 个答案:

答案 0 :(得分:2)

您正在寻找TDataSetProvider.BeforeUpdateRecord事件。为此事件编写事件处理程序,您可以手动控制数据如何应用回数据库。

像这样的东西

procedure TDataModule1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  { Set applied to tell DataSnap that you have applied this record yourself }
  Applied := True;

  case UpdateKind of
    ukModify:
      begin
        Table1.Edit;
        { set the values of the fields something like this }
        if not VarIsEmpty(DeltaDS.FieldByName('NewValue')) then
          Table1['SomeField'] := DeltaDS.FieldByName('SomeField').NewValue;
        Table1.Post;
    end;

    ukInsert:
      begin
        Table1.Insert;
        { set the values of the fields }
        Table1['SomeField'] := DeltaDS['SomeField']
        Table1.Post;
      end;

    ukDelete:
      if Table1.Locate('PrimaryKeyField', DeltaDS['PrimaryKeyField'], []) then
        Table1.Delete;
  end; // case
end;

答案 1 :(得分:0)

如果我需要一个ClientDataSet来获得与数据库模式不完全匹配的数据,我会为TQuery组件编写一个查询,该查询以我想要的格式返回数据。然后,我为TQuery组件编写自己的,单独的,删除,插入,刷新和更新查询。

或者,您可以在数据库上创建一个视图,并使用TQuery组件中的视图。

如果您想要一个独立于数据库的自定义ClientDataSet,您需要的是内存数据集。如果您没有内存数据集组件,则Google将“TClientDataSet作为内存数据集”。你最终得到的,基本上是一个美化的列表视图组件。当然,您可以挂钩内存数据集的OnUpdateRecord,以了解何时更新您的真实数据集。

答案 2 :(得分:0)

您可以通过实现TDataSetProvider.OnGetData事件来修改发送到ClientDataSet的数据。

procedure TDataModule1.DataSetProvider1GetData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.Eof do begin
    DataSet.Edit;
    DataSet['Surname'] := UpperCase(DataSet['Surname']);
    DataSet.Post;
    DataSet.Next;
  end; // while
end;

从ClientDataSet应用更新时,您可以使用TDataSetProvider.OnUpdateData事件。与OnGetData事件一样,您在整个数据集上操作而不是单个记录。

procedure TDataModule1.DataSetProvider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.Eof do begin
    DataSet.Edit;
    DataSet['Surname'] := LowerCase(DataSet['Surname']);
    DataSet.Post;
    DataSet.Next;
  end; // while
end;

在OnBeforeUpdateRecord事件之前调用此OnUpdateData事件。 OnGetData和OnUpdateData事件也在整个数据集上运行,而OnBeforeUpdateRecord则为每个修改过的记录调用一次。