1

有谁知道(或想知道)为什么 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 的命令文本,同时附加额外的条件。

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

尝试对一组连续的字符执行此操作,这些字符在一个长行中永远存在,并且在编辑窗口内没有换行符,该编辑窗口总是很小,无法查看,不允许包装文本等等等。

只需 0.02 美元。

于 2011-08-30T00:13:43.787 回答