Azure表存储错误请求-查询语法错误

时间:2019-03-07 00:12:16

标签: azure-storage

以下内容曾经起作用。

      public void CreateTableIfMissing()
    {
        var info = new StorageInfo(); // initialized with tablename and connectionstring
        var storageAccount = CloudStorageAccount.Parse(info.ConnectionString);
        var tableClient = storageAccount.CreateCloudTableClient();
        var table = tableClient.GetTableReference(info.TableName);
        try
        {
            table.CreateIfNotExists();
            var batchOperation = new TableBatchOperation();
            var s = DateTime.Now.ToString();
            var entry = new TableEntity("partkey"+s,"rowkey"+s);
            batchOperation.Insert(entry);
            table.ExecuteBatch(batchOperation);

        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

错误信息是

{Microsoft.WindowsAzure.Storage.StorageException: 
ErrorCode "InvalidInput"
Element 0 in the batch returned an unexpected response code.
StatusMessage:0:Bad Request - Error in query syntax

该表用于通过带有Azure同步的Serilog进行错误记录。 我可以看到,如果我连接到Azure Storage Explorer,它仍在获取日志记录。

我没有更改连接字符串

[更新]

我正在尝试一项操作,但是遇到了麻烦

'TableOperation' does not contain a constructor that takes 2 arguments
Cannot access internal constructor 'TableOperation' here

single op

more info

[更新]

如果我遵循Ivan的建议但忽略了ToString(“ o”)参数,则错误为

ErrorMessage:The 'PartitionKey' parameter of value 'partkey3/7/2019 8:33:25 PM' is out of range.

这很有道理。

我想知道为什么它能奏效!

1 个答案:

答案 0 :(得分:4)

更新

对于先前代码(而非更新代码)中的错误消息:

{Microsoft.WindowsAzure.Storage.StorageException: 
ErrorCode "InvalidInput"
Element 0 in the batch returned an unexpected response code.
StatusMessage:0:Bad Request - Error in query syntax

原因是表存储中的partkey和rowkey不接受“ /”之类的字符。当您使用包含字符“ /”的DateTime.Now.ToString()作为partkey和rowkey的后缀时,将导致错误。 请格式化日期时间并删除“ /”,您可以在代码中使用DateTime.Now.ToString("o")(或其他正确格式)。

有关更新的代码:

错误是因为TableOperation class没有构造函数(参数或无参数)。您可以导航至TableOperation类,并查看其用法。

enter image description here

在这种情况下,应使用Insert method之类的静态var op = TableOperation.Insert(entry)而不是var op = new TableOperation(entry,TableOperationType.Insert)

还有一件您需要知道的事情,表存储中的partkey和rowkey不接受“ /”之类的字符,因此当您使用datetime.now作为partkey和rowkey的后缀时,您应该使用{{ 1}}。否则会导致错误。

示例代码对我来说很好:

var s = DateTime.Now.ToString("o")

有关表存储的更多代码示例,请参考此article