我正在使用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
!
答案 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组件的鼠标右键单击菜单访问它。