как обработать нулевые значения для типа данных SQLDecimal в классах FileHelper

Я пытаюсь загрузить использование файла 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 в моей собственной логике?

Сообщите мне, было ли Вам нужно больше деталей.Заранее спасибо.

6
задан keepsmilinyaar 6 January 2010 в 05:37
поделиться

4 ответа

[

] Можно попробовать использовать тип 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;
] [

]без атрибутов.[

].
3
ответ дан 9 December 2019 в 20:44
поделиться
[

] Почему нельзя использовать [] десятичную [] или соответствующий .net тип данных вместо []SqlDecimal[]?[
]? Я предлагаю вам изменить код на [] публичный десятичный? Скорость; [] вместо этого. [

]
0
ответ дан 9 December 2019 в 20:44
поделиться

Я никогда не работал с 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". Опять же, я не знаком с библиотекой. :(

)
2
ответ дан 9 December 2019 в 20:44
поделиться

Остальные комментарии правильно использовать

private decimal? internalRate;

И позже создать свойство для преобразования, на самом деле библиотека только автоконвертирует нативные типы, а SqlDecimal не является таковым.

public SqlDecimal? Rate
{
    get 
    {
        if (internalRate.HasValue)
            return new SqlDecimal(internalRate.Value);
        else
            return null;
    }
}

PS: Если u хочет перейти к пользовательскому способу конвертирования, то для его использования для чтения u необходимо переопределить метод StringToField (FieldToString вызывается для записи)

Надеюсь, это поможет :)

.
7
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: