有没有人知道(或者想要做出一个假设)为什么TSqlDataset有一个 commandtext 属性(字符串)而TSqlQuery有一个 sql 属性(tstrings)?
考虑sql语句
select id, name from
table
order by name
如果我使用TSqlQuery,那么我可以通过访问sql [1]来动态更改查询中的表名,但如果我使用TSqlDataset(如果我需要一个bidrectional数据集,我必须连接数据集)到提供者,然后到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,并将其commandtext设置为默认的TSqlDataSet的commandtext,同时附加额外条件。
答案 0 :(得分:5)
1)TSQLQuery
更倾向于与BDE TQuery兼容。 BDE TQuery具有SQL: TStrings
属性。 TSQLDataSet
应该用于新的应用程序。
2)虽然SQL: TStrings
对某些任务很有用,但它也容易出错。程序员通常会在再次填充之前忘记清除SQL属性。此外,如果您的查询很大,填充SQL可能会导致性能下降。因为在每个SQL.Add(...)
调用时,dbExpress代码在ParamCheck为True时解析查询。这可以通过使用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;
答案 1 :(得分:-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
尝试将这样做的一组连续字符永远存在于一条长行中,在编辑窗口内没有换行符,对于查看而言,这些换行符总是很小,不允许包装文本等等。< / p>
只需0.02美元。