首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取数查询字段乱序

取数查询字段乱序
EN

Stack Overflow用户
提问于 2011-11-08 02:04:17
回答 2查看 350关注 0票数 0

我的Access查询返回的字段顺序混乱。我的理解是,对于查询结果中的每一行,字段的顺序与查询的SELECT语句中指定的顺序相同。我做错了什么?

代码语言:javascript
复制
        String query =
            "SELECT " +
                "bas.[BAS BACnet Object Type/Instance], " +
                "bas.[BAS BACnet Object Name], " +
                "bas.[BAS Point List Description], " +
                "ore.[ORE Data Direction], " +
                "ref.[ENUM_H], " +
                "yk.[CCC Max Value (eng units)], " +
                "yk.[CCC Min Value (eng units)], " +
                "yk.[CCC Enum/Data Set], " +
                "ore.[ORE COV Increment], " +
                "ore.[ORE Display Precision] " +
            "FROM (([OV2 BAS] AS bas " +
            "INNER JOIN [OV2 ORE] AS ore ON bas.[Ref ID] = ore.[Ref ID]) " +
            "INNER JOIN [OV2 RefID] AS ref ON bas.[Ref ID] = ref.[Ref ID]) " +
            "INNER JOIN [YK CAPP] AS yk ON bas.[Ref ID] = yk.[Ref ID] " +
            "WHERE bas.[BAS BACnet Object Type/Instance] <> '';";

        try
        {
            cmd = new OleDbCommand(query, this._conn);
            reader = cmd.ExecuteReader();

            if (reader.HasRows == false)
            {
                Exception e = new Exception("Read of mapping table returned no results.");
                throw e;
            }

            while (reader.Read() != false)
            {
                Int32 columns;
                Object[] fields = new Object[10];

                columns = reader.GetValues(fields);

                avClass = new AVClass();

                for (int i = 0; i < AVClass.AV_CLASS_PROPERTIES; i++)
                {
                    avClass.Properties[i] = new AVProperty((AVProperty.PROPERTY_ID)i, fields[i]);
                    results.Add(avClass);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("ERROR: " + e.Message);
            Console.WriteLine(e.ToString());
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-08 02:18:41

目前还不清楚这是否是唯一的问题,但在我看来这是错误的:

代码语言:javascript
复制
for (int i = 0; i < AVClass.AV_CLASS_PROPERTIES; i++)
{
    avClass.Properties[i] = new AVProperty((AVProperty.PROPERTY_ID)i, fields[i]);
    results.Add(avClass);
}

您将为每个字段的结果列表添加相同的引用(avClass)。我怀疑您想把Add调用放在循环之后。

此外,您还没有展示什么是AVProperty.PROPERTY_ID,但是您需要确保查询的SELECT部分与之匹配。可能是个枚举...因此,您需要与"bas.BAS BACnet对象类型/实例“对应的枚举值具有值0,依此类推。

(如果您能给出更多相关代码,我们也许能为您提供更多帮助。我还强烈建议您仔细检查您的代码,使您的名称更加自解释和惯用。.NET不使用SHOUTY_CAPS作为名称。)

此外:

忽略从GetValues.返回的值,没有对任何应该为disposed

  • You're的对象使用using语句
票数 0
EN

Stack Overflow用户

发布于 2011-11-08 02:24:26

如上所述,它们是按选择顺序排列的。

您正在根据avClass.Properties的顺序来读取它们...为此,avXClass.Properties3必须位于所需的点列表描述的位置

这不是一个好主意,这改变了两端的顺序,如果你幸运的话,你的代码会立即崩溃。某种类型的映射可能会做到这一点,或者干脆

AVClass.SetPropertySomeKnownPropertyName = reader.FieldsSomeKnownFieldName;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8040615

复制
相关文章

相似问题

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