Azure IoT Hub GetNextAsTwinAsync после выполнения запроса становится исключением

Я пытаюсь запросить устройства в своем Azure IoT Hub:

var query = registry.CreateQuery("SELECT * FROM devices where statusUpdateTime<=" + (rightnowUTC-tenMinAgoUTC ));
        while (query.HasMoreResults)
        {
            var page = await query.GetNextAsTwinAsync();
            Console.WriteLine("Devices con aggiornamento negli ultimi dieci minuti");
            foreach (var twin in page)
            {
                Console.WriteLine("Device id: " + twin.DeviceId + ", Connection state: " + twin.ConnectionState + ", Status: " +
                 twin.Status + ", Last activity time: " + twin.LastActivityTime + ", Status updated time: "+twin.StatusUpdatedTime);
            }
        }

Я проверил сам объект запроса и позволил циклу while выполняться.

Как только он перейдет к «GetNextAsTwinSync», будет поднято это исключение:

(Inner Exception #0) System.ArgumentException: {"Message":"ErrorCode:ArgumentInvalid;BadRequest","ExceptionMessage":"Tracking ID:b862e066a6944c9caf8f726aae82f80d-G:12-TimeStamp:07/10/2019 11:55:01"}
       at Microsoft.Azure.Devices.HttpClientHelper.ExecuteAsync(HttpClient httpClient, HttpMethod httpMethod, Uri requestUri, Func`3 modifyRequestMessageAsync, Func`2 isMappedToException, Func`3 processResponseMessageAsync, IDictionary`2 errorMappingOverrides, CancellationToken cancellationToken)
       at Microsoft.Azure.Devices.HttpClientHelper.PostAsync[T](Uri requestUri, T entity, IDictionary`2 errorMappingOverrides, IDictionary`2 customHeaders, MediaTypeHeaderValue customContentType, ICollection`1 customContentEncoding, CancellationToken cancellationToken)
       at Microsoft.Azure.Devices.HttpRegistryManager.ExecuteQueryAsync(String sqlQueryString, Nullable`1 pageSize, String continuationToken, CancellationToken cancellationToken)
       at Microsoft.Azure.Devices.Query.GetNextAsync(QueryOptions options)
       at Microsoft.Azure.Devices.Query.GetAndCastNextResultAsync[T](QueryResultType type, QueryOptions options)
       at Microsoft.Azure.Devices.Query.GetNextAsTwinAsync(QueryOptions options)
       at Microsoft.Azure.Devices.Query.GetNextAsTwinAsync()

person Istorn    schedule 10.07.2019    source источник


Ответы (1)


Я рекомендую прочитать запрос Центра Интернета вещей. язык для двойников устройств и модулей, заданий и маршрутизации сообщений

Ваша строка запроса неверна, и это причина System.ArgumentException.

Используйте следующую строку запроса:

string querystring = $"SELECT * FROM devices where statusUpdateTime <= '{(DateTime.UtcNow - TimeSpan.FromMinutes(10)).ToString("o")}'";

Обратите внимание, что форматы ISO 8601 настоятельно рекомендуются для типа данных datetime.

person Roman Kiss    schedule 11.07.2019
comment
Привет Роман, не могли бы вы объяснить мне, кроме формата ISO, что является реальной ошибкой? Вы написали запрос с теми же сравнительными типами (промежутком времени), что и я, но... В чем моя настоящая ошибка? - person Istorn; 11.07.2019
comment
Во-первых, строка запроса должна следовать за выражением T-SQL, поэтому значение даты и времени должно быть в виде текста с использованием одинарных кавычек. Во-вторых, правильный формат даты и времени, такой как ISO 8601, например. 2019-07-11T11:13:38.3052721Z - person Roman Kiss; 11.07.2019