Я пытаюсь загрузить использование файла FileHelpers (как он уже за исключением этой проблемы :P) я должен сохранить данные файла CSV в базу данных, и так использую тип данных SqlDecimal для хранения десятичных значений файлов CSV.
[FileHelpers.FieldOptional()]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;
Все это хорошо работает, пока у меня нет пустого значения для FixRate1. Это отмечается с ошибкой.
"Предупредите Значение Exception:Null, найденное для поля 'Rate' в классе 'SWTrade'. Необходимо указать FieldNullValueAttribute, потому что это - ValueType и не может быть пустым".
Я пытался поместить [FileHelpers. FieldNullValue (SqlDecimal. Пустой указатель)], но это, очевидно, бросает ошибку.
Аргументом атрибута должно быть константное выражение, typeof выражение или выражение создания массива типа параметра атрибута
Даже при том, что я переопределяю метод FieldToString в классе SqlDecimalConverter, функция не вызвана при чтении данных.
Ну, при этом есть ли способ, которым я могу присвоить какое-либо нулевое значение, или даже некоторые другие hardcoded оценивают данным Уровня, которые я могу затем заменить пустым указателем direclty в моей собственной логике?
Сообщите мне, было ли Вам нужно больше деталей.Заранее спасибо.
] Можно попробовать использовать тип Nullable. Если вы используете тип Nullable, то вам не нужно указывать атрибут FieldNullValue.[
] [[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal? Rate;
]
[]Этот подход прекрасно работает с DateTime, используя встроенный конвертер типов FileHelpers.[
] []Если это не работает, то вы можете назначить значение по умолчанию, которое вы можете считать нулем. Но это может быть проблематично, если есть действительное значение, которое соответствует выбранному значению по умолчанию:[
] [[FieldNullValue(typeof(SqlDecimal), "-1")]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;
]
[][]Update[][
] []I just did a test and simply using a decimal? type works fine. Тогда вы можете преобразовать его в своем коде в соответствующий SqlType для доступа к базе данных. Думаю, это самый простой подход.[
] []Так что поле будет выглядеть так:[
] [public decimal? Rate;
]
[]без атрибутов.[
].] Почему нельзя использовать [] десятичную [
] или соответствующий .net тип данных вместо []SqlDecimal[
]?[
]?
Я предлагаю вам изменить код на [] публичный десятичный? Скорость; [
] вместо этого. [
Я никогда не работал с FileHelpers, но вы могли бы попробовать вместо этого:
[FileHelpers.FieldNullValue(null)]
public SqlDecimal? Rate;
В дополнение к другим вашим атрибутам, конечно.
Обратите внимание на большое изменение - я добавил вопросительный знак в SqlDecimal
, чтобы сделать его nullable type.
Тогда вы можете использовать Rate.HasValue
, чтобы определить, является ли он нулевым или нет, и Rate.Value
, чтобы получить доступ к SqlDecimal
, если HasValue
является истинным.
Что-то вроде этого будет правильно использовать SqlDecimal.Null
после разбора файла:
SqlDecimal trueRate = (Rate.HasValue ? Rate.Value : SqlDecimal.Null);
Edit - Возможно, если вы сделаете Rate nullable (SqlDecimal?
), вам даже не понадобится атрибут "FieldNullValue". Опять же, я не знаком с библиотекой. :(
Остальные комментарии правильно использовать
private decimal? internalRate;
И позже создать свойство для преобразования, на самом деле библиотека только автоконвертирует нативные типы, а SqlDecimal не является таковым.
public SqlDecimal? Rate
{
get
{
if (internalRate.HasValue)
return new SqlDecimal(internalRate.Value);
else
return null;
}
}
PS: Если u хочет перейти к пользовательскому способу конвертирования, то для его использования для чтения u необходимо переопределить метод StringToField (FieldToString вызывается для записи)
Надеюсь, это поможет :)
.