根据this page,,可以使用TClientDataset
作为内存数据集,完全独立于任何实际数据库或文件。它描述了如何设置数据集的表结构以及如何在运行时将数据加载到其中。但是当我试图按照D2009中的说明进行操作时,第4步(table.Open
)引发了异常。它说它没有指定提供者。
该页面上示例的整个要点是构建一个不需要提供程序的数据集。页面是错误的,它是否过时,或者我在某个地方错过了一步?如果页面错误,我需要使用什么来创建一个完全独立的内存数据集?我一直在使用TJvMemoryData
,但如果可能的话,我想减少数据集添加到项目中的额外依赖项数量。
答案 0 :(得分:21)
在运行时,您可以使用table.CreateDataset
,或者如果这是在设计图面上,您可以右键单击CDS并单击创建数据集。您需要为CDS指定列/类型,然后才能执行此操作。
答案 1 :(得分:20)
如果它有所帮助,这里是一段代码,我在其中创建了一个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;
您只需替换自己的数据信息即可。 千斤顶
答案 2 :(得分:8)
不要忘记在安装中包含MIDAS.DLL,或者只是在uses子句中包含MidasLib。否则使用TClientDataSet
将在客户端的计算机上引发错误。也许这很明显,但实际上我忘了这一次。
答案 3 :(得分:7)
您可以使用table.CreateDataSet
答案 4 :(得分:5)
此页面中的代码在任何Delphi版本中都不起作用。对CreateDataSet的调用已经将数据集置于活动状态(“已打开”)。您应该使用.CreateDataSet OR .Open。不是两个。
当您想要自己填充数据集时,如果要从Provider(通过ProviderName属性)和.CreateDataSet获取数据,请使用.Open。
BTW:有关ClientDataSets及其功能的深入参考,请查看优秀的Cary Jensen articles on CodeGear Developer Network(首先阅读最早的那些)
答案 5 :(得分:3)
如果你想要一个无依赖,高质量和功能丰富(更不用说免费!)的内存数据集,我强烈推荐kbmMemTable。是TClientDataset
所做的一切,然后是一些。
答案 6 :(得分:1)
由于某种原因,这对我不起作用。我在设计时执行CreateDataset
,但它仍然会崩溃应用程序。这对我来说还是个未知数。
一个警告。不要这样做:
XXXClientDataSet.Close;
XXXClientDataSet.Open;
因为它会报告错误。而不是Open
,请使用
xxxClientDataSet.CreateDataset;
在我的应用程序中,我需要重置数据并再次加载,这又导致错误消息。
答案 7 :(得分:1)
下面的墓地石头用于一些自由组件
在Delphi 5 / Delphi 7中,有一些举措可以将任何具有已发布属性的对象(更准确地说 - 数组或某些集合)放入数据库中。 在Torry.net上,这些是CollectionDataSet和Object DataSet LINQ之前的这些年。 但是,由于DB-VCL代码很少有文档记录,并且自16位Delphi 1.0以来就是意大利面条 - 那些没有开发。
还有基于回调的(基于事件的)Snap对象数据集,不是那么过时了。虽然它给开发人员留下了太多恕我直言。
TDBF.sf.net表具有内存模式,但已被提前删除。 TDBF也死了。
rxLib / JediVCL有MemoryDataset。虽然rxLib目标是源代码级兼容性,因为16位Delphi 1直到Delphi 5.这使代码严重受损。在JVCL中,它有一些关注和删除老化的代码,但是当需要更深层次而不是琐碎的用法时仍然是半生不熟。
还有免费的个人DCU组件,如SQLMemoryTable,但不是最近的版本。我想知道是否可以使用Firebird Embedded / SQLite创建内存表而不使用像RAMdrive这样的系统范围的黑客攻击: - )
答案 8 :(得分:0)
我的偏好是将数据集实际管理为XML。您可以使用设计器工具创建基本结构,然后将其保存到磁盘。这允许它在可执行文件之外进行管理,作为资源编译,或在版本控制中单独管理。
以这种方式执行此操作时,您可以使用LoadFromFile / Stream和Save variants。请记住根据您的使用情况正确使用LogChanges和MergeChangeLog。
答案 9 :(得分: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.
答案 10 :(得分:0)
对我来说,这是由midas.dll不匹配引起的。 我通过将MidasLib添加到主程序的uses子句(因此静态链接库)来修复它。 更多信息:http://codeverge.com/embarcadero.datasnap/tclientdataset-createdataset-failing-wit/1097715 在这里:http://edn.embarcadero.com/article/29297