Azure Запрос таблицы: System.InvalidOperationException: «Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым». - PullRequest
0 голосов
/ 04 апреля 2020

Я иногда получаю следующую ошибку во время выполнения моего запроса на выполнение таблицы

System.InvalidOperationException: 'Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.'

private CloudTable table;

    public AzureTableManager(string _CloudTableName)
    {
        if (string.IsNullOrEmpty(_CloudTableName))
        {
            throw new ArgumentNullException("Table", "Table Name can't be empty");
        }
        try
        {
            string ConnectionString = PrimariusOMS.Properties.Settings.Default.AzureTableStorage.ToString();
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            table = tableClient.GetTableReference(_CloudTableName);
            table.CreateIfNotExists();
        }
        catch (StorageException StorageExceptionObj)
        {
            throw StorageExceptionObj;
        }
        catch (Exception ExceptionObj)
        {
            throw ExceptionObj;
        }
    }

    public List<T> RetrieveEntity<T>(string TenantName, string Query = null) where T : TableEntity, new()
    {
TableQuery<T> DataTableQuery = new TableQuery<T>();
            if (!String.IsNullOrEmpty(Query))
            {
                Query += " and PartitionKey eq '" + TenantName + "'";
            }
            else { Query = "PartitionKey eq '" + TenantName + "'"; }

            DataTableQuery = new TableQuery<T>().Where(Query);
            IEnumerable<T> IDataList = table.ExecuteQuery(DataTableQuery);
            List<T> DataList = new List<T>();
            foreach (var singleData in IDataList)
                DataList.Add(singleData);
            return DataList;
}

Здесь возвращается ошибка:

IEnumerable<T> IDataList = table.ExecuteQuery(DataTableQuery);

Это мой пример вызова:

List<AzureTableManager.DTTConfig> dtt = TableManagerObj.RetrieveEntity<AzureTableManager.DTTConfig>(tenantID, "RowKey eq 'Mass WhatIf'");

В SQL соединениях, используйте для преодоления этого с помощью блока USING или убедиться, что читатель закрыт. Как мне справиться с этим здесь?

1 Ответ

1 голос
/ 06 апреля 2020

Вы можете попытаться обновить ссылку на последнюю версию WindowsAzure.Storage.

В новой версии класс CloudTable больше не содержит метод ExecuteQuery. Вместо этого он имеет методы ExecuteQueryAsync и ExecuteQuerySegmentedAsync.

Этот код работает для меня для получения данных:

public static async Task<List<T>> ExecuteQueryToListAsync<T>(this CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
{
    var result = new List<T>();

    TableContinuationToken token = null;
    do
    {
        TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync(query, token);
        token = seg.ContinuationToken;
        result.AddRange(seg);
    }
    while (token != null);

    return result;
}
...