こんにちは。
TQueryなど使って、Select文を発行してデータを取得したあと、TQueryを使いまわしております。
最初に取得したデータ(フィールド名・フィールドデータ)を、別に保存しておきたいのですが、簡単な方法が判りません。
(フォームには新たに貼り付けたくない)
よろしくお願いいたします。
TQuery ではなく TTable での例ですが
//最初のDB
Table1.DatabaseName := ExtractFilePath(ParamStr(0));
Table1.TableName := 'Music1.db';
Table1.Active := True;
//FieldDefsを保存
FieldDefsCopy := TFieldDefs.Create(Table1);
FieldDefsCopy.Assign(Table1.FieldDefs);
Table1.Active := False;
//次のDB
Table1.DatabaseName := ExtractFilePath(ParamStr(0));
Table1.TableName := 'Music2.db';
Table1.Active := True;
のように取得後 Create した FieldDefs に Assign して保存してはどうでしょうか?
KHE00221さん、ありがとうございます。
TFieldDefsを使った事がないため、データの引き出し方が
見つからなかったんですが、教えていただけますでしょうか?
よろしくお願いいたします。
FieldDefs の数は FieldDefs.Count で求められます
Table1.FieldDefs.Add(Name,ftString,20,True);
//動的に設定する方法の内容を取得する場合
Table1.FieldDefs.Items[0].Name;
Table1.FieldDefs.Items[0].DataType;
Table1.FieldDefs.Items[0].Size;
Table1.FieldDefs.Items[0].Required;
//またこの4個のほかオブジェクトインスペクタで設定できる内容を取得する場合
Table1.FieldDefs.Items[0].Attributes;
Table1.FieldDefs.Items[0].Precision;
TDataSetを使えばプログラムの動作中なら、保持できます。
KHE00221さん、ありがとうございます。
食い違いの原因がやっとわかりました。
Selectで取得したデータとフィールド名が取得したいということでした。
すみません。
フィールド名はうまく取得できました。
HOtaさん、ありがとうございます。
TDataSetにそのままTQueryを入れてしまうと、TQueryを使いまわした際に、
TDataSetもかわってしまいます。
うまくデータを受け渡せるでしょうか?
ClientDataSetに読み込んで保持させてしまうとかはどうですか?
やりたい動作でなければごめんなさい。
保持したい数だけClientDataSetは必要です。
設計時に用意しておくか,実行時にTClientDataSet.Createをしてください。
DataSetProvider.DataSet := Query1;
ClientDataSet1.SetProvider(DataSetProvider1);
ClientDataSet1.Open;
Query1.Close;
Query1.SQL.Text := 'SELECT ・・・';
ウソを書いていました
FieldDef ではなく FieldList でした
Table での例ですが
フィールド名、長さ、データの取得は
Talbe1.Open;
for I:=0 to Table1.FieldList.Count -1 do
begin
S1 := Table1.FieldList.Strings[I]; //フィールド名
J1 := Table1.FieldList.Fields[I].Size; //フィールドの長さ
S2 := Table1.FieldList.Fields[I].asString; //テキストデータ
end;
Table1.Close;
で可能です
Query にも FieldList はあるので多分可能でしょう
Ruさん、ありがとうございます。
ClientDataSetがみつかりませんでした。
Delphi4を使ってますが、バージョンの問題かも知れないですね。
KHE00221さん、ありがとうございます。
TFieldListに保存してみましたが、Query1.Close;で
データが失われてしまいました。
なかなか難しいですね・・・
とりあえず今回は配列を用意して、解決することにしました。
スマートに解決できたらいいなと思ったんですが残念。
ツイート | ![]() |