dbExpress设计问题

时间:2011-08-18 05:09:07

标签: delphi dbexpress

有没有人知道(或者想要做出一个假设)为什么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,同时附加额外条件。

2 个答案:

答案 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美元。