2016-05-18 5 views
2

Я пытаюсь преобразовать DataTable в XML, а затем загружать его в хранилище Azure blob.Загрузка DataTable в Azure blob storage

Этот код работает, но кажется неуклюжим и голоден. Есть лучший способ сделать это? Я особенно говорю о том, что я сбрасываю поток памяти в массив байтов, а затем создаю из него новый поток памяти.

 var container = blobClient.GetContainerReference("container"); 
     var blockBlob = container.GetBlockBlobReference("blob"); 

     byte[] blobBytes; 
     using (var writeStream = new MemoryStream()) 
     { 
      using (var writer = new StreamWriter(writeStream)) 
      { 
       table.WriteXml(writer, XmlWriteMode.WriteSchema); 

      } 
      blobBytes = writeStream.ToArray(); 
     } 
     using (var readStream = new MemoryStream(blobBytes)) 
     { 
      blockBlob.UploadFromStream(readStream); 
     } 
+0

Как уже были данные таблицы, вы загрузили их в таблицу в учетной записи хранилища? Или ваше решение требует использования XML? –

+0

@MartynC Он не обязательно должен быть XML, но он должен быть в блочном хранилище, и его нужно легко де-сериализовать обратно в DataTable –

ответ

3

Новый ответ:

Я узнал лучший подход, который должен открыть поток записи непосредственно сгустка. Например:

 using (var writeStream = blockBlob.OpenWrite()) 
     { 
      using (var writer = new StreamWriter(writeStream)) 
      { 
       table.WriteXml(writer, XmlWriteMode.WriteSchema); 

      } 
     } 

Per нашего разработчика, это не требует всю таблицу быть помещены в буфер в памяти, и, вероятно, сталкиваются с меньшим копирование вокруг данных.

Оригинальный ответ:

Вы можете использовать метод CloudBlockBlob.UploadFromByteArray и загрузить массив байтов непосредственно, вместо создания второго потока.

См. https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.uploadfrombytearray.aspx для синтаксиса метода.

+0

Только то, что я искал! Кажется очевидным сейчас. Спасибо! –

+0

Мне это нравится. Я немного изменил свою реализацию. Зачем использовать StreamWriter? OpenWrite возвращает CloudBlobStream, который наследуется от Stream. Вы можете передать это непосредственно в WriteXml без использования дополнительного вложенного оператора 'using'. –