2008-11-08 31 views
17

根據this page,,可以使用TClientDataset作爲內存數據集,完全獨立於任何實際的數據庫或文件。它描述瞭如何設置數據集的表結構以及如何在運行時將數據加載到數據集中。但是當我試圖按照D2009中的說明操作時,步驟4(table.Open)引發了一個異常。它說它沒有指定提供者。Delphi:使用TClientDataset作爲內存數據集

該頁面上示例的全部要點是構建不需要提供者的數據集。頁面是否錯誤,是過時的,還是我錯過了某個步驟?如果頁面錯誤,我需要使用什麼來創建完全獨立的內存數據集?我一直在使用TJvMemoryData,但如果可能的話,我想減少我的數據集添加到我的項目中的額外依賴項的數量。

回答

20

在運行時,您可以使用table.CreateDataset或者如果這是在設計圖面,你可以右鍵點擊CDS,然後單擊創建數據集。您需要爲CDS指定列/類型,然後才能執行此操作。

+0

點擊「創建數據集」?當我右鍵單擊XE2中的TClientDataset時沒有這樣的選項。 – 2012-07-11 18:28:46

+1

它存在於XE7中;第五個選項從頂部。 – BIBD 2015-03-18 15:51:15

7

使用table.CreateDataSet

17

如果進一步的幫助,這裏是一段代碼,我創建了一個用作內存表中的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; 

您可以直接替換自己的數據信息,並去。 傑克

+3

您不需要打開電話。 – 2008-11-10 09:42:53

+0

命令「CreateDataSet」會導致我的NullPointer訪問衝突。 (Delphi 10.1 Berlin Starter) – 2016-08-30 23:14:27

5

此頁面的代碼在任何Delphi版本中都不起作用。對CreateDataSet的調用已將數據集置於活動狀態(「已打開」)。您應該使用.CreateDataSet或.Open。不是都。

使用。打開時要從提供者(通過提供者名稱屬性)獲取數據,並在想要自行填充數據集時使用.CreateDataSet。

BTW:對於在有關ClientDataSets及其功能的深度基準採取優異Cary Jensen articles on CodeGear Developer Network一看(讀最舊的,第一)

8

不要忘了,包括在MIDAS.DLL安裝或乾脆包括MidasLib在使用條款。否則,使用TClientDataSet會在客戶機上產生錯誤。也許這很明顯,但我實際上忘記了一次。

+2

如果您想包含MidasLib,請注意[此錯誤](http://stackoverflow.com/q/15449386/2523663)。 – 2014-07-28 11:02:25

1

由於某種原因,這不適合我。我在設計時執行CreateDataset,但它仍然使應用程序崩潰。對我來說這仍然是未知的。 一個警告。不要這樣做:

XXXClientDataSet.Close; 
XXXClientDataSet.Open; 

因爲它會報告錯誤。而不是打開,使用

xxxClientDataSet.CreateDataset; 

在我的應用程序中,我需要重置數據並重新加載它,並再次導致錯誤消息。

0

我的偏好是將數據集實際管理爲XML。您可以使用設計器工具創建基本結構,然後將其保存到磁盤。這允許它在可執行文件之外進行管理,作爲資源進行編譯,或者在版本控制中單獨進行管理。

以這種方式進行操作時,可以使用LoadFromFile/Stream和Save variants。請記住根據您的使用情況正確使用LogChanges和MergeChangeLog。

3

如果你想要一個無依賴,高質量,功能豐富(更不用說免費!)內存數據集,我強烈建議kbmMemTable。一切TClientDataset是否做,然後一些。

1

墓地下面石頭一些自由報部件

在Delphi 5/Delphi 7中的時間有舉措,使與已發表的性質的任何對象(更準確地 - 陣列或它們的一些集合)到數據庫中。 在Torry.net上的那些是CollectionData和Object DataSet 在LINQ之前的這麼多年。 但是由於DB-VCL代碼很少有文檔記載,並且是16位Delphi 1.0以來的意大利麪 - 這些都沒有發展。

還有一個基於回調(基於事件)的管理對象數據集,並非如此過時。儘管它在開發者的肩膀上留下了太多的恕我直言。

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

rxLib/JediVCL有MemoryDataset。雖然rxLib目標是源於16位Delphi 1直到Delphi 5的源代碼級別的兼容性,但這嚴重影響了代碼。在JVCL中,它有一些注意力並且去掉了老化的代碼,但是當需要比平凡的用法更深的時候,它仍然是一半的。

也有免費的個人DCU組件,如SQLMemoryTable,但不是最近的版本。我不知道Firebird Embedded/SQLite是否可以用來創建內存表而不使用像RAMdrive這樣的系統級黑客:-)

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. 
相關問題