2010-01-06 2 views
6

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

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

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

«Предупреждать Исключение: Нулевое значение найдено поле„Rate“в классе „SWTrade“Вы должны указать FieldNullValueAttribute, потому что это является ValueType и не могу быть пустым.».

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

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

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

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

Пожалуйста, дайте мне знать, если вам нужно больше деталей. Спасибо заранее.

ответ

2

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

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

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

Обратите внимание на большое изменение здесь. Я добавил знак вопроса в SqlDecimal, чтобы сделать его nullable type.

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

Что-то, как это будет правильно использовать SqlDecimal.Null после разбора файла:

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

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

+0

Нет, он упомянул, что попробовал SqlDecimal.Null, который не является постоянным выражением. – Sapph

+0

@Sapph: извините, мое плохое - я не очень внимательно прочитал вопрос (и ваш ответ). –

3

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

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

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

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

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

Update

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

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

public decimal? Rate; 

без атрибутов, необходимых.

+0

[FieldNullValue (typeof (SqlDecimal), «01/01/0001»)] Не думаете ли вы, что он сам породил бы ошибку при попытке конвертировать возможное значение datetime в тип SQLDecimal? – keepsmilinyaar

+0

К сожалению. :) Спасибо, это осталось от теста DateTime. Изменено на -1. –

+0

{"Недопустимый литой из 'System.String' в 'System.Data.SqlTypes.SqlDecimal'."} - это то, что я получаю, когда я помещаю в указанную вами строку. [FieldNullValue (typeof (SqlDecimal), "-1")] Любые другие идеи ??? – keepsmilinyaar

0

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

+0

Не совсем уверен, как работают FileHelpers. Вероятно, придется попробовать и посмотреть исходный код. Я действительно хочу преобразовать весь файл csv в datatable, чтобы я мог SQLBulkCopy сохранять данные. Но я получаю следующее сообщение об ошибке, при использовании обнуляемых типов «DataSet не поддерживает System.Nullable <>» Кроме того, при вызове «fileHelperEngine.ReadFileAsDT()» метод коррекции FieldToString() не срабатывает. – keepsmilinyaar

7

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

private decimal? internalRate; 

А потом создать свойство для преобразования, на самом деле библиотека только autoconverts собственных типов и SqlDecimal не один.

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

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

Надеется, что это помогает :)

+0

Удивительно, что функция FieldToString не вызывается, и хелпер файла генерирует исключение напрямую. – keepsmilinyaar

+0

U возвращает значение SqlDecimal? Можете ли вы отправить мне код конвертера или вставить его здесь, чтобы проверить, что случилось? благодаря – MarcosMeli

Смежные вопросы