首页 > 解决方案 > Azure 表存储错误请求 - 查询语法错误

问题描述

以下曾经工作。

      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 存储资源管理器,我可以看到它仍在获取日志记录。

我没有更改连接字符串

[更新]

我正在尝试单个操作但遇到问题

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

单次操作

更多信息

[更新]

如果我遵循 Ivan 的建议但省略 ToString("o") 参数,则错误是

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

这是有道理的。

我想知道为什么它曾经奏效!

标签: azureazure-storageazure-blob-storage

解决方案


更新:

对于您之前的代码中的错误消息(不是更新的):

{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 类并查看它的用法。

在此处输入图像描述

在你的情况下,你应该使用它的静态Insert methodvar op = TableOperation.Insert(entry)不是var op = new TableOperation(entry,TableOperationType.Insert).

还有一点你需要知道,表存储中的partkey和rowkey不接受像“/”这样的字符,所以当你使用datetime.nowpartkey和rowkey的后缀时,你应该使用var s = DateTime.Now.ToString("o"). 否则会导致错误。

示例代码对我来说很好:

        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 s = DateTime.Now.ToString("o");
                var entry = new TableEntity("partkey" + s, "rowkey" + s);
                var op = TableOperation.Insert(entry);
                table.Execute(op);               

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

更多关于表存储的代码示例,可以参考这篇文章


推荐阅读