Доступ к полям запроса вне порядка - PullRequest
0 голосов
/ 07 ноября 2011

Мой запрос доступа возвращает поля не по порядку.Насколько я понимаю, для каждой строки из результата запроса поля будут в том же порядке, который был указан в операторе 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 голосов
/ 07 ноября 2011

Как указано выше, они находятся в выбранном порядке.

Вы читаете их в порядке упорядочения avClass.Properties .... Чтобы это работало, avXClass.Properties [3] должен находиться там, где вам нужно.[Описание списка точек]

Не очень хорошая идея, измените порядок на обоих концах, и, если вам повезет, ваш код сразу упадет.Это может сделать какое-то отображение, или просто

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

0 голосов
/ 07 ноября 2011

Ну, неясно, является ли это only проблемой, но мне это кажется неправильным:

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 Object Type / Instance]", имело значение 0 и т. Д.

(Если вы можете дать больше соответствующего кода, мы можем помочь вам больше. Я также настоятельно рекомендую вам пройтись по своему коду и сделать свои имена более понятными и идиоматический. .NET не использует SHOUTY_CAPS для имен.)

Дополнительно:

  • Вы не используете операторы using для каких-либо объектов, которые должны быть расположены
  • Вы игнорируете значение, возвращаемое из GetValues.
...