如何在TQuery中控制Fields的顺序

时间:2011-06-06 07:24:56

标签: delphi

我正在使用Delphi 7. TQuery连接到Firebird DB。

表T1有3个字段(A,B和C)。

要查询该表,我编写了以下代码:

MyQuery.SQL.Clear;
MyQuery.SQL.Add('SELECT B, C, A FROM T1'); // because that's the order I want them
MyQuery.Open;

然而,当用FieldNames填充字符串网格的顶行时(通过迭代Fields[]数组)我不想依赖静态字段名到列映射,但我的问题是Fields[]数组中的字段顺序与我使用的SQL中的字段顺序不匹配。

修改

我在运行时中使用一个例程来处理具有不同SQL的多个报表。我根本不想依赖FieldNames,所以我需要按照TQuery.Fields中的SQL中出现的字段的顺序对TQuery.SQL数组进行排序(在运行)。

我的问题是:如何控制MyQuery.Fields[]中字段的顺序,使其与我在SQL中使用的顺序相匹配?我应该尝试一个更好的选择吗?

修改

抱歉,最后这只是一个愚蠢的错误。太多了SQL.Clear

2 个答案:

答案 0 :(得分:3)

首先,这个:

MyQuery.SQL.Add('SELECT B, C, A FROM T1');

应该是:

MyQuery.SQL.Text := 'SELECT B, C, A FROM T1';

或:

MyQuery.SQL.Clear;
MyQuery.SQL.Add('SELECT B, C, A FROM T1');

因为Add()单独向MyQuery.SQL中的现有查询添加内容。在这种情况下,行为将取决于提供者。对于某些提供程序,您只需执行第一个查询而忽略其他查询,而对于其他提供程序,您将收到错误。无论哪种方式都是错的。

如果仍然没有解决它,你在说什么Query,什么样的数据库和什么样的网格?行为可能依赖于数据库或依赖于网格;对于它的价值,我以前从未见过它,我总是按照SQL顺序获得列。但我主要使用Firebird,MsSQL,一个小Oracle。

答案 1 :(得分:2)

DataSet的Fields集合项可以在Fields Editor中重新排列,您可以从TQuery组件的鼠标右键单击菜单访问它。