user1939211
user1939211

Reputation: 11

How to Insert/Update into Azure Table using Windows Azure SDK 2.0

I have multiple entities to be stored in the same physical Azure table. I'm trying to Insert/Merge the table entries from a file. I'm trying to find a way to do this w/o really serializing each property or for that matter creating a custom entities.

While trying the following code, I thought maybe I could use generic DynamicTableEntity. However, I'm not sure if it helps in an insert operation (most documentation is for replace/merge operations).

The error I get is HResult=-2146233088 Message=Unexpected response code for operation : 0 Source=Microsoft.WindowsAzure.Storage

Any help is appreciated.

Here's an excerpt of my code

_tableClient = storageAccount.CreateCloudTableClient();
            _table = _tableClient.GetTableReference("CloudlyPilot");

            _table.CreateIfNotExists();


            TableBatchOperation batch = new TableBatchOperation();

            ....

             foreach (var pkGroup in result.Elements("PartitionGroup"))
            {

                foreach (var entity in pkGroup.Elements())
                {
                    DynamicTableEntity tableEntity = new DynamicTableEntity();
                    string partitionKey = entity.Elements("PartitionKey").FirstOrDefault().Value;
                    string rowKey = entity.Elements("RowKey").FirstOrDefault().Value;
                    Dictionary<string, EntityProperty> props = new Dictionary<string, EntityProperty>();

                    //if (pkGroup.Attribute("name").Value == "CloudServices Page")
                    //{
                    //    tableEntity = new CloudServicesGroupEntity (partitionKey, rowKey);
                    //}
                    //else
                    //{
                    //    tableEntity = new CloudServiceDetailsEntity(partitionKey,rowKey);
                    //}

                    foreach (var element in entity.Elements())
                    {
                        tableEntity.Properties[element.Name.ToString()] = new EntityProperty(element.Value.ToString());
                    }

                    tableEntity.ETag = Guid.NewGuid().ToString();
                    tableEntity.Timestamp = new DateTimeOffset(DateTime.Now.ToUniversalTime());

                    //tableEntity.WriteEntity(/*WHERE TO GET AN OPERATION CONTEXT FROM?*/)

                    batch.InsertOrMerge(tableEntity);
                }
                _table.ExecuteBatch(batch);

                batch.Clear();

            }

Upvotes: 1

Views: 3775

Answers (1)

Sandrino Di Mattia
Sandrino Di Mattia

Reputation: 24870

Have you tried using DictionaryTableEntity? This class allows you to dynamically fill the entity as if it were a dictionary (similar to DynamicTableEntity). I tried something like your code and it works:

        var batch = new TableBatchOperation();

        var entity1 = new DictionaryTableEntity();
        entity1.PartitionKey = "abc";
        entity1.RowKey = Guid.NewGuid().ToString();
        entity1.Add("name", "Steve");
        batch.InsertOrMerge(entity1);

        var entity2 = new DictionaryTableEntity();
        entity2.PartitionKey = "abc";
        entity2.RowKey = Guid.NewGuid().ToString();
        entity2.Add("name", "Scott");
        batch.InsertOrMerge(entity2);

        table.ExecuteBatch(batch);

        var entities = table.ExecuteQuery<DictionaryTableEntity>(new TableQuery<DictionaryTableEntity>());

One last thing, I see that you're setting the Timestamp and ETag yourself. Remove these two lines and try again.

Upvotes: 3

Related Questions