gpt4 book ai didi

delphi - dbExpress设计问题

转载 作者:行者123 更新时间:2023-12-03 19:34:50 24 4
gpt4 key购买 nike

有人知道(或对此有所怀疑)为什么TSqlDataset具有commandtext属性(字符串)而TSqlQuery具有sql属性(字符串)吗?

考虑sql语句

select id, name from
table
order by name


如果使用TSqlQuery,则可以通过访问sql [1]动态更改查询中的表名,但是如果使用的是TSqlDataset(因为我需要双向数据集,则必须将数据集连接到提供程序然后将其设置为tclientdataset),则必须按字面意义设置commandtext字符串。虽然上面的示例很简单,但是当涉及更多的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,因此排除了将查询存储在简单字符串中的可能性。在某些情况下,我想通过添加行“和statuses.id = 3”或“和customers.id = 249”来过滤显示的数据量。如果查询存储为TStrings,那么我可以在基本查询中添加虚拟行“和1 = 1”,然后根据需要更新此行。但是查询是一个长字符串,我无法轻易访问它的末尾。

我当前正在做的(代替更好的解决方案)是创建另一个TSqlDataSet,并将其命令文本设置为默认TSqlDataSet的命令文本,同时附加额外的条件。

最佳答案

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)具有 macro variables,可简化动态查询文本的构建。例如:

ADQuery1.SQL.Text := 'SELECT * FROM &TabName';
ADQuery1.Macros[0].AsRaw := 'Orders';
ADQuery1.Open;

关于delphi - dbExpress设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com