Recently I threw some code together to add objects into an Azure table. I used the class:
[DataServiceKey("PartitionKey", "RowKey")] public class OrderMessage : TableServiceEntity { public DateTime OrderDate { get; set; } public string CustomerName { get; set; } public string CreditCard { get; set; } public int Quantity { get; set; } public decimal CostEach { get; set; } }
Upon adding the data to the table using:
TableServiceContext tableContext = connection.TableClient.GetDataServiceContext(); tableContext.AddObject(connection.OrderTableName, message); DataServiceResponse response = tableContext.SaveChangesWithRetries();
I received the error:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>InvalidInput</code>
<message xml:lang="en-US">One of the request inputs is not valid.</message>
</error>
After wasting some time looking at help and Googling I was skimming across some documentation on tables and it happened to list the supported property types for Azure tables. I knew that they had limited support but not till I looked at that list did it occur to me that I was using the unsupported datatype ‘decimal’. Modifying the class so that CostEach was of type ‘double’ resolved my problem.
It sure would be nice if the error was a little more explicit. I’m sure that somewhere in the Azure code it knows what happened. I also find it interesting that rather than returning information in the DataServiceResponse it throws an exception. I don’t see this ability to throw exceptions in the documentation and in fact the documentation says that the return value is:
A DataServiceResponse that contains status, headers, and errors that result from the call to SaveChanges.
On well I guess somebody kinda forgot to update their XML comments on the method with:
/// <exception cref="System.Data.Services.Client.DataServiceClientException">A stealth exception that we won't tell anybody about</exception>
More than once I’ve seen a reminder on blogs to make sure you only use the supported data types on your table entities. Here’s another reminder for you and *bonk* me!