Delphi:如何使用TClientDataset作为内存数据集

26
根据此页面,可以将TClientDataset作为内存数据集使用,完全独立于任何实际的数据库或文件。它描述了如何设置数据集的表结构以及如何在运行时加载数据。但是,在D2009中按照其说明进行操作时,第4步(table.Open)引发了异常。它说没有指定提供程序。
那个页面的整个示例的重点是构建一个不需要提供程序的数据集。这个页面是错的、过时的还是我漏掉了哪一步呢?如果那个页面错了,我应该使用什么代替来创建一个完全独立的内存数据集呢?我一直在使用TJvMemoryData,但如果可能的话,我想减少我的项目添加到其中的额外依赖项。
11个回答

0

这是OP在第一篇帖子中提到的已经修正的工作代码。您可以从DBGrid中获取一个TClientDataset显示的内存表。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBClient, Grids, DBGrids, StdCtrls, MidasLib;

type
  TForm1 = class(TForm)
    MemTable: TClientDataSet;
    Button1: TButton;
    Button2: TButton;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: word;
begin
  MemTable.DisableControls;
  for i := 1 to 20000 do
  begin
    MemTable.Append;
    MemTable.FieldByName('ID').AsInteger       := i;
    MemTable.FieldByName('Status').AsString    := 'Code'+IntToStr(i);
    MemTable.FieldByName('Created').AsDateTime := Date();
    MemTable.FieldByName('Volume').AsFloat     := Random(10000);
    MemTable.Post;
  end;
  MemTable.EnableControls;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MemTable.IndexFieldNames := 'Volume';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MemTable.FieldDefs.Add('ID',      ftInteger, 0, False);
  MemTable.FieldDefs.Add('Status',  ftString, 10, False);
  MemTable.FieldDefs.Add('Created', ftDate,    0, False);
  MemTable.FieldDefs.Add('Volume',  ftFloat,   0, False);
  MemTable.CreateDataSet;
end;

end.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接