フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: オンメモリテーブル (MyBase)
DEKO
管理者
投稿数: 2690
オンメモリテーブル (MyBase)
on: 2013/04/06 10:50 Sat

以下のコードは

[#150:To use TClientDataset as memory dataset (Scalabium Software)]
http://www.scalabium.com/faq/dct0150.htm

を要約したものです。

uses
..., DB, DBClient;

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
Table: TClientDataset;
begin
table := TClientDataset.Create(Application);
with table do
begin
FieldDefs.Add('ID' , ftInteger, 0, False);
FieldDefs.Add('Status' , ftString , 10, False);
FieldDefs.Add('Created', ftDate , 0, False);
FieldDefs.Add('Volume' , ftFloat , 0, False);
CreateDataset;
Open;
for i := 1 to 100 do
begin
Append;
FieldByName('ID' ).AsInteger := i;
FieldByName('Status' ).AsString := 'Code' + IntToStr(i);
FieldByName('Created').AsDateTime := Date();
FieldByName('Volume' ).AsFloat := Random(10000);
Post;
end;
First;
ShowMessage(FieldByName('Status' ).AsString);
Next;
ShowMessage(FieldByName('Status' ).AsString);
Close;
end;
end;

 
使い所によっては便利だと思います。MyBase 全般の使い方については hiderin さんトコの記事が秀逸ですのでご一読ください。

[MyBase (Delphi-fan)]
http://hiderin.air-nifty.com/delphi/mybase/index.html

DEKO
管理者
投稿数: 2690
Re: オンメモリテーブル (MyBase)
on: 2013/06/01 21:07 Sat

TDataSetProvider を併用すると既存のテーブルからデータを抽出する事が出来ます。

1.TClientDataSet の ProviderName プロパティに TDataSetProvider  を指定。
2.TDataSetProvider の DataSet に TDataSet 派生のデータセット (BDE, dbGo, IBX, DBX, FireDAC ...) を指定。
3.TClientDataSet を Open
4.TClientDataSet.SaveToFile() でオンメモリテーブルデータを出力。
5.TClientDataSet をClose

 
TClientDataSet.LoadFromFile() でオンメモリテーブルデータを読み込ませれば、SQL こそ使えませんが自由に追加 / 編集 / 削除ができます。

注意点ですが、TClientDataSet や TDataSetProvider をコードで動的作成する場合には TClientDataSet.ProviderName プロパティで TDataSetProvider を指定するのではなく、TClientDataSet.SetProvider() で TDataSetProvider を指定してください。これは、"TClientDataSet が TDataSetProvider を名前で探す場合には所有者 (Owner) が同一でなくてはならない" という制限があるからです。

これを忘れると以下のようなエラーメッセージを拝む事になります。

プロジェクト Project1.exe は例外クラス EDatabaseError (メッセージ 'データプロバイダ/パケットがありません')を送出しました。

 
つまり、

  DataSetProvider.Name := 'DSP';
ClientDataSet.ProviderName := DataSetProvider.Name;

 
ProviderName プロパティ指定だとエラー原因を忘れがちなので

  ClientDataSet.SetProvider(DataSetProvider);

 
"最初から SetProvider() メソッドで指定しておいた方が無難" という事です。

See Also:
[Paradox(BDE)のテーブルをエクスポートする簡単な方法 (Team Japan ブログ)]
http://blogs.embarcadero.com/teamj/2013/03/06/3722/

[Datasnap.DBClient.TClientDataSet.ProviderName (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/Datasnap.DBClient.TClientDataSet.ProviderName

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.033 sec.