以下内容曾经起作用。
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
[更新]
如果我遵循Ivan的建议但忽略了ToString(“ o”)参数,则错误为
ErrorMessage:The 'PartitionKey' parameter of value 'partkey3/7/2019 8:33:25 PM' is out of range.
这很有道理。
我想知道为什么它能奏效!
答案 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类,并查看其用法。
在这种情况下,应使用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。