【发布时间】:2011-08-18 05:09:07
【问题描述】:
有没有人知道(或想知道)为什么 TSqlDataset 有一个 commandtext 属性(字符串)而 TSqlQuery 有一个 sql 属性(tstrings)?
考虑sql语句
select id, name from
table
order by name
如果我使用 TSqlQuery,那么我可以通过访问 sql[1] 动态更改查询中的表名,但如果我使用的是 TSqlDataset(如果我需要双向数据集,我必须这样做,数据集是连接的到提供者,然后到 tclientdataset),我必须逐字设置命令文本字符串。虽然上面的例子是微不足道的,但当 sql 语句涉及更多时,它可能是一个问题。
更新: 从到目前为止的cmets和答案来看,我似乎被误解了。我不太关心提高组件的运行时性能(当查询需要一秒钟时,一毫秒有什么关系),但我确实关心程序员(即我)和维护程序的能力。在现实生活中,我有以下存储在 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 的命令文本,同时附加额外的条件。
【问题讨论】:
-
如果考虑到更改 SQL 文本语句所花费的时间与语句本身的执行时间有关,则无需考虑更改整个 SQL 字符串。在所有情况下,整个 SQL 语句都将被发送到后台 DB 驱动程序,因此这两种方法是相等的。 (即使设置 SQL[1] 可能会慢一点,如果
ParamCheck=true- 请参阅 da-soft 答案)如果您想要更快的东西,请不要使用 dbExpress,而是使用直接数据库访问组件。 -
1) 抱歉,那不是 1 毫秒。只要相信... 2) 255 不是 Delphi 字符串的限制,因为 Delphi2。 3) 你可以有效地使用 as TStrings, as String。我的答案有一切。
-
以防大软没说清楚;字符串的 255 个字符限制适用于 1995 年的 Delphi 1。自 1996 年的 2.0 版以来,它不再适用于 Delphi,那是 15 年前的事了!多行字符串可以在 delphi 属性检查器中编辑,如果它们注册了设计时“帮助器”,在这种情况下,对于 TSqlDataSet.CommandText,它已经可供您使用。只需单击属性检查器中的省略号按钮,您就会得到一个漂亮的 SQL 编辑器帮助对话框。它不是 RapidSQL 或 Toad,但比使用 1" 宽的字符串属性要好。