有谁知道(或想知道)为什么 TSqlDataset 有一个 commandtext属性(字符串)而 TSqlQuery 有一个sql属性(tstrings)?
考虑sql语句
select id, name from
table
order by name
如果我使用 TSqlQuery,那么我可以通过访问 sql[1] 动态更改查询中的表名,但如果我使用的是 TSqlDataset(如果我需要双向数据集,我必须这样做,数据集连接到提供程序然后到 tclientdataset),我必须逐字设置命令文本字符串。虽然上面的例子很简单,但当 sql 语句涉及更多时,它可能会成为一个问题。
更新:从到目前为止的评论和答案来看,我似乎被误解了。我不太关心提高组件的运行时性能(当查询需要一秒钟时,一毫秒有什么关系),但我确实关心程序员(即我)和维护程序的能力。在现实生活中,我有以下存储在 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”,然后根据需要更新该行。但是查询是一个长字符串,我无法轻松访问它的结尾。
我目前正在做的(代替更好的解决方案)是创建另一个 TSqlDataSet,并将其命令文本设置为默认的 TSqlDataSet 的命令文本,同时附加额外的条件。