4

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

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

我的问题是我需要修改其中一些数据才能进入我的 ClientDataSet。ClientDataSet 具有与原始数据库数据不匹配的持久字段。我什至无法将数据库中的字符串放入 ClientDataSet 的备注字段中。

ClientDataSet 是我的数据层的一部分,因此我需要将数据库中的数据逐个字段与 ClientDataSet 保持一致(当然大多数都可以直接通过,但许多需要路由和/或转换)。

这个事情谁有经验?

4

3 回答 3

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;
于 2010-03-30T22:49:35.977 回答
1

您可以通过实现 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;

此 OnUpdateData 事件在 OnBeforeUpdateRecord 事件之前调用。OnGetData 和 OnUpdateData 事件也对整个数据集进行操作,而 OnBeforeUpdateRecord 为每个修改的记录调用一次。

于 2010-03-31T20:41:21.097 回答
0

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

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

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

于 2010-03-30T21:18:34.113 回答