Как обрабатывать нулевые значения для типа данных SQLDecimal в классах FileHelper - PullRequest
6 голосов
/ 06 января 2010

Я пытаюсь загрузить файл с помощью FileHelpers (как это уже было, за исключением этой проблемы: P) Я должен сохранить данные файла CSV в базе данных, поэтому я использую тип данных SqlDecimal для хранения десятичных значений файлов CSV.

[FileHelpers.FieldOptional()]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;

Все это прекрасно работает, пока у меня не будет пустого значения для FixRate1. Это помечено с ошибкой.

"Исключение предупреждения: найдено нулевое значение для поле «Оценить» в классе 'SWTrade. Вы должны указать FieldNullValueAttribute, потому что это является ValueType и не может быть нулевым. "

Я попытался поместить [FileHelpers.FieldNullValue (SqlDecimal.Null)], но, очевидно, выдает ошибку.

Аргумент атрибута должен быть константное выражение, выражение типа или выражение для создания массива тип параметра атрибута

Несмотря на то, что я переопределил метод FieldToString в классе SqlDecimalConverter , функция не вызывается при чтении данных.

Что ж, в таком случае, есть ли способ, которым я могу назначить любое нулевое значение или даже какое-либо другое жестко запрограммированное значение для данных Rate, которые затем я могу заменить на null direclty в моей собственной логике?

Пожалуйста, дайте мне знать, если вам понадобится более подробная информация. Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 06 января 2010

Другие комментарии правильны, вам нужно использовать

private decimal? internalRate;

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

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

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

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

3 голосов
/ 06 января 2010

Вы можете попробовать использовать тип Nullable. Если вы используете тип Nullable, вам не нужно указывать атрибут FieldNullValue.

[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal? Rate;

Этот подход прекрасно работает с DateTime, используя встроенный конвертер типов FileHelpers.

Если это не сработает, вы можете назначить значение по умолчанию, которое вы можете считать нулевым. Но это может быть проблематично, если существует фактическое значение, соответствующее выбранному значению по умолчанию:

[FieldNullValue(typeof(SqlDecimal), "-1")]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;

Обновление

Я только что сделал тест и просто использовал десятичную? Тип работает отлично. Затем вы можете преобразовать его в своем коде в правильный SqlType для доступа к базе данных. Я думаю, что это самый простой подход.

Таким образом, поле будет выглядеть так:

public decimal? Rate;

атрибуты не требуются.

2 голосов
/ 06 января 2010

Я никогда не работал с FileHelpers, но вы можете попробовать вместо этого:

[FileHelpers.FieldNullValue(null)]
public SqlDecimal? Rate;

В дополнение к вашим другим атрибутам, конечно.

Обратите внимание на большое изменение - я добавил вопросительный знак к SqlDecimal, чтобы сделать его обнуляемым типом .

Затем вы можете использовать Rate.HasValue для определения того, является ли он нулевым или нет, и Rate.Value для доступа к SqlDecimal, если HasValue - true.

Примерно так будет правильно использовать SqlDecimal.Null после разбора файла:

SqlDecimal trueRate = (Rate.HasValue ? Rate.Value : SqlDecimal.Null);

Edit - возможно, что если вы сделаете Rate nullable (SqlDecimal?), вам даже не понадобится атрибут "FieldNullValue". Опять же, я не знаком с библиотекой. (

0 голосов
/ 06 января 2010

Почему вы не можете использовать Decimal или соответствующий тип данных .net вместо SqlDecimal?
Я предлагаю вместо этого изменить код на public Decimal? Rate;.

...