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
|