1

TSqlDataset にはcommandtextプロパティ (文字列) があるのに、TSqlQuery にはsqlプロパティ (tstrings) がある理由を知っている人はいますか?

SQLステートメントを検討してください

select id, name from
table
order by name

TSqlQuery を使用すると、sql[1] にアクセスしてクエリ内のテーブル名を動的に変更できますが、TSqlDataset を使用している場合 (双方向データセットが必要な場合は、データセットがプロバイダーに接続されているため)そこから tclientdataset に)、commandtext 文字列を文字どおりに設定する必要があります。上記の例は些細なことですが、SQL ステートメントがさらに複雑になると問題になる可能性があります。

更新:これまでのコメントと回答から判断すると、誤解されていたようです。コンポーネントの実行時パフォーマンスの向上はあまり気にしませんが (クエリに 1 秒かかる場合、1 ミリ秒が問題になるわけではありません)、プログラマー (つまり私) とプログラムを維持する能力については気になります。実際には、TSqlQuery に格納されている次のクエリがあります。

select dockets.id, dockets.opendate, customers.name, statuses.statname,
dockets.totalcost, dockets.whopays, dockets.expected, dockets.urgent,
(dockets.totalcost - dockets.billed) as openbill,
(dockets.totalcost - dockets.paid) as opencost,
location.name as locname, dockets.attention,
statuses.colour, statuses.disporder, statuses.future, dockets.urgcomment
from location, statuses, dockets left join customers
on dockets.customer = customers.id
where dockets.location = location.id
and dockets.status = statuses.id

文字列の文字数は数えていませんが、255 文字以上あると確信しているため、クエリを単純な文字列に格納することはできません。特定の状況で、「and statuses.id = 3」または「and customers.id = 249」という行を追加して、表示されるデータの量をフィルタリングしたいと考えています。クエリが TStrings として格納されている場合は、基本クエリにダミー行「and 1 = 1」を追加し、必要に応じてこの行を更新できます。しかし、クエリは 1 つの長い文字列であり、その末尾に簡単にアクセスすることはできません。

私が現在行っていること (より良い解決策の代わりに) は、別の TSqlDataSet を作成し、その commandtext をデフォルトの TSqlDataSet の commandtext に設定し、追加の条件を追加することです。

4

2 に答える 2

5

1)TSQLQueryむしろ、BDE TQuery との互換性のためです。また、BDE TQuery にはSQL: TStringsプロパティがあります。TSQLDataSet新しいアプリケーションに使用されるはずのものです。

2)SQL: TStrings一部のタスクには便利ですが、エラーが発生しやすくなります。多くの場合、プログラマーは再度入力する前に SQL プロパティをクリアするのを忘れます。また、クエリが大きい場合、SQL がいっぱいになるとパフォーマンスが低下する可能性があります。SQL.Add(...)ParamCheck が True の場合、各呼び出しで dbExpress コードがクエリを解析するためです。BeginUpdate/EndUpdateまたは ParamCheck を False に設定することで解決できる場合があります。ただし、ParamCheck を False に設定すると、パラメータの自動作成が停止することに注意してください。

SQLQuery1.SQL.BeginUpdate;
try
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add('SELECT * FROM');
  SQLQuery1.SQL.Add('Orders');
finally
  SQLQuery1.SQL.EndUpdate;
end;

CommandTextにはそのような問題はありません。

3)Format関数を使用して、動的 SQL 文字列を作成できます。

var
  sTableName: String;
...
sTableName := 'Orders';
SQLDataSet1.CommandText := Format('select * from %s', [sTableName]);

4) AnyDACなどの他のデータ アクセス ライブラリにはマクロ変数があり、動的なクエリ テキストの作成が簡素化されます。例えば:

ADQuery1.SQL.Text := 'SELECT * FROM &TabName';
ADQuery1.Macros[0].AsRaw := 'Orders';
ADQuery1.Open;
于 2011-08-18T05:19:26.977 に答える
-1

TSqlQuery は TStrings (Delphi 2010 では TWideStrings) を使用していると言わざるを得ません。これは、はるかに柔軟だからです。

クエリが次のとおりであるとします。

Select
Item1,
Item2,
Item3,
Item4
FROM MyTable

  • はるかに読みやすい
  • コピーして外部クエリ ツールに貼り付けることができ、フォーマットされたままになります
  • セクションを簡単にコメントアウトできます

Select
Item1,
/*
Item2,
Item3,
*/
Item4
FROM MyTable

  • 簡単にアイテムを追加できます

Select
Item1,
Item2,
Item2a,
Item2b,
Item3,
Item3a,
Item3b,
Item4
FROM MyTable

ラップされたテキストなどを許可しない表示には常に小さすぎる編集ウィンドウ内で改行なしで 1 つの長い行で永遠に続く連続した文字のセットに対してそれを試してみてください。

わずか 0.02 ドル。

于 2011-08-30T00:13:43.787 に答える