24

根据这个页面,它可以TClientDataset用作内存数据集,完全独立于任何实际的数据库或文件。它描述了如何设置数据集的表结构以及如何在运行时将数据加载到其中。但是当我尝试按照 D2009 中的说明进行操作时,步骤 4 ( table.Open) 引发了异常。它说它没有指定提供者。

该页面上示例的全部要点是构建不需要提供程序的数据集。页面是否错误,是否已过时,或者我在某处遗漏了一步?如果页面错误,我需要使用什么来创建一个完全独立的内存数据集?我一直在使用TJvMemoryData,但如果可能的话,我想减少我的数据集添加到我的项目中的额外依赖项的数量。

4

11 回答 11

24

在运行时您可以使用table.CreateDataset,或者如果这是在设计图面上,您可以右键单击 CDS 并单击创建数据集。不过,您需要先为 CDS 指定列/类型,然后才能执行此操作。

于 2008-11-08T17:52:46.000 回答
21

如果它有进一步的帮助,这里有一段代码,我在其中创建了一个用作内存表的 ClientDataset:

procedure TfrmPRMain.ConfigureDataset;
begin
  With cdsMain do begin
    FieldDefs.Add('bDelete', ftBoolean);
    FieldDefs.Add('sSource', ftString, 10);
    FieldDefs.Add('iSection', ftInteger);
    FieldDefs.Add('iOrder', ftInteger);
    FieldDefs.Add('sBranch', ftString, 10);
    FieldDefs.Add('sPulseCode', ftString, 10);
    FieldDefs.Add('sCode', ftString, 10);
    FieldDefs.Add('dtWorkDate', ftDate);
    FieldDefs.Add('iWorkWeek', ftInteger);
    FieldDefs.Add('sName', ftString, 50);
    CreateDataSet;
    LogChanges := False;
    Open;
  end;
end;

您可以只替换您自己的数据信息即可。杰克

于 2008-11-08T20:15:33.390 回答
9

不要忘记在您的安装中包含 MIDAS.DLL 或简单地将 MidasLib 包含在 uses 子句中。否则使用TClientDataSet将在客户端机器上引发错误。也许这很明显,但我实际上忘记了一次。

于 2008-11-17T10:33:56.610 回答
7

您可以使用table.CreateDataSet

于 2008-11-08T17:38:46.280 回答
6

此页面中的代码在任何 Delphi 版本中都不起作用。对 CreateDataSet 的调用已将数据集置于活动状态(“打开”)。您应该使用 .CreateDataSet 或 .Open。不是都。

当您想从提供者(通过 ProviderName 属性)获取数据时使用 .Open,当您想自己填充数据集时使用 .CreateDataSet。

顺便说一句:有关 ClientDataSets 及其功能的深入参考,请查看CodeGear 开发人员网络上优秀的 Cary Jensen 文章(首先阅读最旧的文章)

于 2008-11-09T07:33:30.027 回答
3

如果您想要一个无依赖、高质量且功能丰富(更不用说免费!)的内存数据集,我强烈推荐kbmMemTable。一切都TClientDataset做,然后一些。

于 2009-05-26T02:07:59.063 回答
1

出于某种原因,这对我不起作用。我CreateDataset在设计时执行,但它仍然使应用程序崩溃。这对我来说仍然是未知数。一警告。不要这样做:

XXXClientDataSet.Close;
XXXClientDataSet.Open;

因为它会报错。而不是Open,使用

xxxClientDataSet.CreateDataset;

在我的应用程序中,我需要重置数据并再次加载它,这再次导致错误消息。

于 2009-04-19T02:17:04.203 回答
1

下面是一些自由组件的墓地石头

在 Delphi 5/Delphi 7 时代,有倡议将任何具有已发布属性的对象(更准确地说 - 数组或这些属性的某些集合)放入数据库。在 Torry.net 上,那些是 LINQ 之前的 CollectionDataSet 和 Object DataSet 等。但由于 DB-VCL 代码几乎没有文档记录,并且自 16 位 Delphi 1.0 以来就是意大利面条 - 这些都没有开发。

还有基于回调(基于事件)的 Snap Object Dataset,并没有那么过时。尽管它在开发人员的肩膀上留下了太多恕我直言。

TDBF.sf.net 表具有内存模式,但被提前删除。TDBF 也死了。

rxLib/JediVCL 有 MemoryDataset。尽管 rxLib 目标是从 16 位 Delphi 1 到 Delphi 5 的源代码级兼容性。这大大削弱了代码。在 JVCL 中,它有一些关注并删除了老​​化的代码,但是当需要一些比琐碎的更深入的使用时,它仍然是半生不熟的。

还有一些免费的个人 DCU 组件,例如 SQLMemoryTable,但不适用于最近的版本。我想知道 Firebird Embedded / SQLite 是否可以用来创建内存表而不使用像 RAMdrive 这样的系统范围的黑客 :-)

于 2011-10-11T20:34:51.563 回答
0

我的偏好是将数据集实际管理为 XML。您可以使用设计器工具创建基本结构,然后将其保存到磁盘。这允许它在可执行文件之外进行管理,作为资源编译,或在版本控制中单独管理。

以这种方式执行此操作时,您可以使用 LoadFromFile/Stream 和 Save 变体。请记住根据您的使用情况正确使用 LogChanges 和 MergeChangeLog。

于 2009-05-26T02:04:16.027 回答
0

这是 OP 在第一篇文章中提到的更正的工作代码。TClientDataset您从DBGrid 中显示的内存表中获得。

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.
于 2013-05-02T01:48:49.720 回答
0

对我来说,这是由 midas.dll 不匹配引起的。我通过将 MidasLib 添加到主程序的 uses 子句来修复它(从而静态链接库)。更多信息在这里:http ://codeverge.com/embarcadero.datasnap/tclientdataset-createdataset-failing-wit/1097715 在这里:http : //edn.embarcadero.com/article/29297

于 2014-05-16T23:24:39.473 回答