2013-08-11 2 views
7

Я получил эту ошибку, когда я выполнил следующий код:Azure ошибка хранения таблицы: «Неожиданный код ответа для работы: 99»

var insert = new TableBatchOperation(); 
foreach (var entity in entities) 
{ 
    insert.Insert(entity); 
} 
cloudTable.ExecuteBatch(insert); 

Если коллекция объектов, содержащиеся 512 элементов. Лазурное SDK через StorageException:

"Unexpected response code for operation : 99" 

Что означает эта ошибка, и как я могу решить эту проблему?

ответ

16

Эта непродуманная ошибка означает, что операции с лазурной массой (по крайней мере в этом случае) занимает до 100 элементов. Ограничьте свою партию, и все будет хорошо.

Я закончил тем, используя что-то вроде этого:

public void Insert(IEnumerable<T> entities) 
{ 
    foreach (var chunk in entities.Chunk(100)) 
    { 
     InsertMaxLimitElements(chunk); 
    } 
} 

private void InsertMaxLimitElements(IEnumerable<T> chunk) 
{ 
    var insert = new TableBatchOperation(); 

    foreach (var entity in chunk) 
    { 
     insert.Insert(entity); 
    } 
    cloudTable.ExecuteBatch(insert); 
} 

Метод расширения Кусок был скопирован из этого answer:

public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize) 
{ 
    while (source.Any()) 
    { 
     yield return source.Take(chunksize); 
     source = source.Skip(chunksize); 
    } 
} 
+2

Несколько других вещей, которые я хотел бы включить сюда - 1) Все объекты в транзакции должен иметь тот же PartitionKey 2) Сущность в транзакции может появляться только один раз. 3) Даже если максимальный размер объекта может быть 1 МБ, максимальный размер пакета может быть 4 МБ. Более подробную информацию об этом можно найти здесь: http://msdn.microsoft.com/en-us/library/windowsazure/dd894038.aspx –

Смежные вопросы