访问查询字段无序

时间:2011-11-07 18:04:17

标签: c# .net-3.5 ms-access-2007

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

        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());
        }

2 个答案:

答案 0 :(得分:0)

目前尚不清楚这是否只是 问题,但这对我来说不合适:

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作为名称。)

此外:

  • 您没有对应该处理的任何对象使用using语句
  • 您忽略了从GetValues返回的值。

答案 1 :(得分:0)

如上所述,它们处于选择顺序。

您正在根据avClass.Properties的排序读取它们.... 为此,avXClass.Properties [3]必须在您想要的位置[点列表描述]

这不是一个好主意,这会改变两端的顺序,如果你很幸运,你的代码会立即失效。 某种映射可能会这样做,或者只是

AVClass.SetProperty [SomeKnownPropertyName] = reader.Fields [SomeKnownFieldName];