首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dbExpress设计问题

dbExpress设计问题
EN

Stack Overflow用户
提问于 2011-08-18 05:09:07
回答 1查看 1.2K关注 0票数 1

有谁知道(或者想做个解释)为什么TSqlDataset有命令文本属性(string),而TSqlQuery具有sql属性(Tstring)?

考虑一下sql语句

代码语言:javascript
复制
select id, name from
table
order by name

如果我使用一个TSqlQuery,那么我可以通过访问sql1动态地更改查询中的表名,但是如果我使用的是一个TSqlDataset (如果我必须这样做,那么dataset就连接到一个提供程序,然后再连接到一个tclientdataset),我必须按字面顺序设置命令字符串。虽然上面的示例很简单,但当sql语句涉及更多时,它可能会成为一个问题。

更新:从目前为止的评论和回答来看,我似乎被误解了。我不太关心提高组件的运行时性能(当查询花费一秒钟时间时,一毫秒有什么关系),但我确实关心程序员(即我)和维护程序的能力。在现实生活中,我有一个存储在TSqlQuery中的查询:

代码语言:javascript
复制
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的命令文本,同时附加额外的条件。

EN

回答 1

Stack Overflow用户

发布于 2011-08-18 05:19:26

1) TSQLQuery是为了与TQuery兼容而设计的。BDE TQuery具有SQL: TStrings属性。TSQLDataSet应该用于新的应用程序。

2)虽然SQL: TStrings在某些任务中是有用的,但它也容易出错。通常,程序员在再次填充之前忘记清除SQL属性。另外,如果您的查询很大,SQL的填充可能会导致性能下降。因为每次调用SQL.Add(...)时,dbExpress代码都会解析查询,而ParamCheck是True。这可以通过使用BeginUpdate / EndUpdate或将ParamCheck设置为False来解决。但是请注意,将ParamCheck设置为False将停止自动参数的创建。

代码语言:javascript
复制
SQLQuery1.SQL.BeginUpdate;
try
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add('SELECT * FROM');
  SQLQuery1.SQL.Add('Orders');
finally
  SQLQuery1.SQL.EndUpdate;
end;

CommandText没有这样的问题。

3)可以使用Format函数构建动态string:

代码语言:javascript
复制
var
  sTableName: String;
...
sTableName := 'Orders';
SQLDataSet1.CommandText := Format('select * from %s', [sTableName]);

4)其他数据访问库(如AnyDAC )具有宏变量,简化了动态查询文本的构建。例如:

代码语言:javascript
复制
ADQuery1.SQL.Text := 'SELECT * FROM &TabName';
ADQuery1.Macros[0].AsRaw := 'Orders';
ADQuery1.Open;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7102653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档