azure - 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.
这是有道理的。
我想知道为什么它曾经奏效!
解决方案
更新:
对于您之前的代码中的错误消息(不是更新的):
{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 method
而var op = TableOperation.Insert(entry)
不是var op = new TableOperation(entry,TableOperationType.Insert)
.
还有一点你需要知道,表存储中的partkey和rowkey不接受像“/”这样的字符,所以当你使用datetime.now
partkey和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;
}
}
更多关于表存储的代码示例,可以参考这篇文章。
推荐阅读
- javascript - 如何使用 Webpack 更正其他 scss 中的 @import scss 文件
- mysql - MySQL Min Max 扣除
- android - 加载长 xml 时自定义对话框延迟应用程序
- jquery - 如何在不使用 jQuery 的情况下在 BLOGGER (blogspot) 中延迟加载图像?
- javascript - 如何在动态表单的输入元素中添加onload
- php - AJAX调用后PHP自动加载无法找到类文件
- git - 'git request-pull' 不会生成对源的拉取请求
- python-3.x - 用于将 2 个不同列表的 2 个元素彼此相邻附加的列表理解
- go - 从函数返回的正确方法是什么?
- javascript - 如何使用静态关键字定义带参数的单例模式?