Я пытаюсь создать таблицу лазурного хранилища и вставлять в нее записи с помощью С#. Я успешно создал таблицу, но она дает мне исключение хранилища 400 Bad Request при вставке в нее записи.
после проверки в отладчике:
StorageException.RequestInformation.ExtendedErrorInformation.ErrorMessage
он показывает ошибку OutOfRangeInput
"One of the request inputs is out of range.\nRequestId:862fdbae-6002-000c-1e7c-ef9373000000\nTime:2019-04-10T09:06:05.9840359Z"
Я воспользовался помощью этой темы Хранилище таблиц Azure возвращает 400 неверных запросов
а также
все равно выдает ту же ошибку. Вот мой код:
public void GetGPSFileData(Config objConfig, TraceWriter log)
{
try
{
BindData objData = new BindData();
string date = DateTime.Now.Date.ToString("ddMMyyyy");
string storageTable = "TABLE" + date + objData.REPCODE;
TableStorage tableStorage = new TableStorage(objData);
CreateTableStorage(objConfig, storageTable, tableStorage, log);
}
catch (StorageException ex)
{
log.Info($"Storage Exception while reading GPS File Data from Azure Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
throw ex;
}
catch (Exception ex)
{
log.Info($"Error while reading GPS File Data from Azure Storage: " + ex.Message + DateTime.Now);
throw ex;
}
}
TableStorage.cs
public class TableStorage: TableEntity
{
public string CLIENTID { get; set; }
public string REPCODE { get; set; }
public int ENTRYNO { get; set; }
public string DEVICEID { get; set; }
public double LAT { get; set; }
public double LNG { get; set; }
public DateTime DATE_TIME { get; set; }
public string PCODE { get; set; }
public string PNAME { get; set; }
public DateTime TXNDATE { get; set; }
public TableStorage(BindData objData)
{
PartitionKey = objData.CLIENTID;
RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
Timestamp = DateTimeOffset.Now;
CLIENTID = objData.CLIENTID;
REPCODE = objData.REPCODE;
ENTRYNO = objData.ENTRYNO;
DEVICEID = objData.DEVICEID;
LAT = objData.LAT;
LNG = objData.LNG;
DATE_TIME = objData.DATE_TIME;
PCODE = objData.PCODE;
PNAME = objData.PNAME;
TXNDATE = objData.TXNDATE;
}
public string ToAzureKeyString(string str)
{
var sb = new StringBuilder();
foreach (var c in str
.Where(c => c != '/'
&& c != '\\'
&& c != '#'
&& c != '/'
&& c != '?'
&& !char.IsControl(c)))
sb.Append(c);
return sb.ToString();
}
}
Создайте и вставьте в код Storage Table:
public void CreateTableStorage(Config objConfig, string tableName, TableStorage tableStorage, TraceWriter log)
{
try
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(objConfig.TABLE_STORAGE_CONN_STRING);
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableName);
table.CreateIfNotExists();
TableOperation insert = TableOperation.Insert(tableStorage);
table.Execute(insert);
}
catch(StorageException ex)
{
log.Info($"Storage Exception while inserting record into Table Storage: " + ex.RequestInformation.ExtendedErrorInformation.ErrorMessage + DateTime.Now);
throw ex;
}
catch(Exception ex)
{
log.Info($"Error while inserting record into Table Storage: " + ex.Message + DateTime.Now);
throw ex;
}
}
Объект класса TableStorage содержит:
В чем может быть проблема? Я совершенно новый лазурный стол для хранения. Пожалуйста помоги. Заранее спасибо.
@IvanYang Нет, я проверял каждое значение перед вставкой, даже пытался передать пустую или нулевую строку
Я считаю, что в вашем классе может отсутствовать конструктор по умолчанию/без параметров, наследующий TableEntity. Конструктор без параметров очень нужен для десериализации объекта при получении из TableStorage.
Обратитесь к этот ответ.
Возможный исправленный код:
public class TableStorage: TableEntity
{
public string CLIENTID { get; set; }
public string REPCODE { get; set; }
public int ENTRYNO { get; set; }
public string DEVICEID { get; set; }
public double LAT { get; set; }
public double LNG { get; set; }
public DateTime DATE_TIME { get; set; }
public string PCODE { get; set; }
public string PNAME { get; set; }
public DateTime TXNDATE { get; set; }
public TableStorage(){}//Added default constructor
public TableStorage(BindData objData)
{
PartitionKey = objData.CLIENTID;
RowKey = ToAzureKeyString(Guid.NewGuid().ToString());
Timestamp = DateTimeOffset.Now;
CLIENTID = objData.CLIENTID;
REPCODE = objData.REPCODE;
ENTRYNO = objData.ENTRYNO;
DEVICEID = objData.DEVICEID;
LAT = objData.LAT;
LNG = objData.LNG;
DATE_TIME = objData.DATE_TIME;
PCODE = objData.PCODE;
PNAME = objData.PNAME;
TXNDATE = objData.TXNDATE;
}
public string ToAzureKeyString(string str)
{
var sb = new StringBuilder();
foreach (var c in str
.Where(c => c != '/'
&& c != '\\'
&& c != '#'
&& c != '/'
&& c != '?'
&& !char.IsControl(c)))
sb.Append(c);
return sb.ToString();
}
}
Я передавал 01.01.01 в TXNDATE, после передачи правильной даты в TXNDATE все работало успешно. Даже если я не создаю конструктор без параметров в TableStorage, он работает, мне действительно нужно создавать конструктор без параметров?
Я думаю, да, он вам понадобится, так как операция чтения не будет работать без него. Итак, в настоящее время я считаю, что вы не читаете какие-либо данные из хранилища, но когда вы будете это делать, вам понадобится конструктор без параметров.
Да, это выдавало мне ошибку при чтении данных
Надеюсь, это также решит вашу проблему с чтением :)
Да, это решило. Спасибо :)
Проблема возникает из-за значения атрибута TXNDATE
. Если вы посмотрите на изображение, которым вы поделились, значение, которое вы отправляете, равно 1/1/01
(т. е. DateTime.MinValue
), тогда как минимально допустимое значение равно 1/1/1601
.
Как только вы передадите правильное значение для TXNDATE
, вы не должны увидеть эту ошибку.
Спасибо, я попытался передать дату в TXNDATE, и это сработало.
Есть ли какие-либо символы, такие как «/» в строке, когда вы пытаетесь вставить?