Delphi 如何控制TQuery中字段的顺序

Delphi 如何控制TQuery中字段的顺序,delphi,Delphi,我使用的是Delphi7查询已连接到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; 但是,当用字段名填充字符串网格的顶行时(通过迭代字段[]数组),我不想依赖静态字段名到列的映射,但我的问题是字段[]数组中字段的顺序与我使用

我使用的是Delphi7<代码>查询已连接到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;
但是,当用
字段名
填充字符串网格的顶行时(通过迭代
字段[]
数组),我不想依赖静态字段名到列的映射,但我的问题是
字段[]
数组中字段的顺序与我使用的SQL中字段的顺序不匹配

编辑

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

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

编辑

对不起,这最后只是一个愚蠢的错误。SQL中的
太多。请清除

首先,这:

MyQuery.SQL.Add('SELECT B, C, A FROM T1');
应该是:

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

因为
Add()
单独在
MyQuery.SQL
中向现有查询追加了一些内容。在这种情况下,行为将依赖于提供者。对于某些提供程序,您只需执行第一个查询,而忽略其他提供程序,而对于其他提供程序,您将得到一个错误。不管怎样都是错的

如果这仍然不能解决问题,那么你在说什么
Query
,什么样的数据库,什么样的网格?行为可能依赖于数据库或网格;值得一提的是,我以前从未见过这种情况发生,我总是按SQL顺序获取列。但我主要使用Firebird、MsSQL和一个小Oracle。

首先,这个:

MyQuery.SQL.Add('SELECT B, C, A FROM T1');
应该是:

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

因为
Add()
单独在
MyQuery.SQL
中向现有查询追加了一些内容。在这种情况下,行为将依赖于提供者。对于某些提供程序,您只需执行第一个查询,而忽略其他提供程序,而对于其他提供程序,您将得到一个错误。不管怎样都是错的


如果这仍然不能解决问题,那么你在说什么
Query
,什么样的数据库,什么样的网格?行为可能依赖于数据库或网格;值得一提的是,我以前从未见过这种情况发生,我总是按SQL顺序获取列。但我主要使用Firebird,MsSQL,一点Oracle。

数据集的字段集合项可以在字段编辑器中重新排列,您可以从TQuery组件上的鼠标右键菜单访问该字段编辑器。

数据集的字段集合项可以在字段编辑器中重新排列,您可以从TQuery组件上的鼠标右键菜单访问该字段编辑器。

可能MyQuery具有持久性字段的获取顺序。当双击查询组件,然后使用弹出的对话框添加字段时,将获得持久字段。您不想依赖字段名是什么意思。您不希望网格列从SQL列获取名称吗?如果这是您正在做的,SQL语法可以帮助您。对不起,伙计们,发现了错误。。。SQL太多了。Clear(考虑到@Cosmin的答案有多讽刺:-)MyQuery可能按照您获得的顺序具有持久性字段。持久性字段就是双击查询组件,然后使用弹出的对话框添加字段时得到的。您不想依赖字段名是什么意思。您不希望网格列从SQL列获取名称吗?如果这是您正在做的,SQL语法可以帮助您。对不起,伙计们,发现了错误。。。太多的SQL.Clear(考虑到@Cosmin的答案,这是多么讽刺:-)提供程序备注在事实上是不正确的,没有DBMS将
换行符
视为语句分隔符,它是有效的语句“token”(不是真正的token,而是作为单个语句一部分的空白)。另外,OP说他正在从返回的游标填充TStringGrid实例。对不起@Cosmin,“查询”的类型在问题文本(“TQuery”)中。恐怕你错过了。我知道要这样做。在前面清除。添加,只是它与我关于TQuery.fields[]中字段顺序的问题无关,所以我故意将其与“uses”子句以及“begin”和“end”一起省略。我同意,大多数情况下,您是根据查询中指定的方式获取列的。它连接到Firebird db,但我真诚地怀疑这对TQuery的工作有任何影响。@user,
“字符串网格”
不必是
TStringGrid
。下面是@Sam,Firebird按SQL语句中指定的顺序返回字段。如果是那样的话,布兰科可能会发现什么。如果您的查询包含持久化字段,它将忽略运行时字段。只需确保没有持久化字段。提供程序备注事实上是不正确的,没有DBMS将
换行符
视为语句分隔符,它是有效的语句“token”(不是真正的token,而是作为单个语句一部分的空白)。另外,OP说他正在从返回的游标填充TStringGrid实例。对不起@Cosmin,“查询”的类型在问题文本(“TQuery”)中。恐怕你错过了。我知道要这样做。在前面清除。添加,只是它与我关于TQuery.fields[]中字段顺序的问题无关,所以我故意将其与“uses”子句以及“begin”和“end”一起省略。我同意,大多数情况下,您是根据查询中指定的方式获取列的。它连接到Firebird db,但我真诚地怀疑这对TQuery的工作有任何影响。@user,
“字符串网格”
不必是
TStringGrid
。下面是@Sam,Firebird按SQL语句中指定的顺序返回字段。那样的话,布兰科可能会