Преобразование DateTime2 случайным образом удаляет пробел между датой и временем - PullRequest
1 голос
/ 08 апреля 2020

У меня есть небольшое консольное приложение, которое должно импортировать файл CSV в базу данных. Это в. NET ЯДЕР 3.1. CSV-файл импортируется без проблем. Проблема возникает при попытке сохранить данные в таблицу. Получается ошибка: «Строковые или двоичные данные будут усечены. Оператор завершен». Получено во время звонка context.SaveChanges(). Чтобы точно определить, в чем заключается ошибка, загрузите Profiler, чтобы увидеть оскорбительный оператор. Оскорбительный фрагмент кода был связан с полем, содержащим дату и время. Чтобы начать с начала и привести к проблеме.

Импортированные данные находятся в столбце и представлены следующим образом:

"20200404121655500" 
"20200404121755500"

Свойство модели импорта определяется следующим образом:

public string Date_And_Time { get; set; }

Свойство модели данных определяется следующим образом:

[Column(TypeName = "DATETIME2(7)")]
public DateTime? Date_And_Time { get; set; }

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

if (DateTime.TryParseExact(Date_And_Time.Trim()
.PadRight(21, '0')
.Substring(0, 21), "yyyyMMddHHmmssFFFFFFF", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime newDateTime)) 
{ model.Date_And_Time = newDateTime; }
else { model.Date_And_Time = null; }

Во время отладки, когда обрабатываются 2 разные даты, они устанавливаются в model.Date_And_Time, как и ожидалось. Объект расширяется, производя всю правильную информацию (год, день, час и т. Д. c.). Перед выполнением SaveChanges проверка объектов показывает, что они оба имеют правильные DateTime объекты. Однако после выполнения этой команды выдается указанное выше исключение SQL. При проверке команды объединения, созданной EF, даты по-разному форматируются. Они следующие:

'2020-04-0412:16:55.5000000' and '2020-04-04 12:17:55.5000000'

У первого нет пробела между датой и временем, тогда как у второго есть пробел. Первое - это то, что вызывает исключение. При выполнении SaveChanges в среднем сохраняется 20 записей, и у некоторых есть место, а у некоторых нет, я не могу найти шаблон. Я пытался использовать точно такую ​​же дату и время, а также с некоторыми без пробела.

1 Ответ

1 голос
/ 09 апреля 2020

После некоторых проб и ошибок я переключился с DateTime на DateTimeOffset. Это было сделано для свойства свойства модели данных, атрибута типа того же свойства и исключения TryParseException. Других изменений нет, и все прошло без исключений. Необходимо выполнить другую миграцию из-за изменения атрибута, вызвавшего изменение шины таблицы.

Единственный пакет сторонних производителей, который использовался для импорта CSV, успешно прошел.

Параметризованное выражение слияния было замечено в профилировщике. К сожалению, я не нашел его, лучше найти ответ.

Понятия не имею, почему модель с типом данных C# DateTime выдает строку, хотя сам параметр был обозначен как DateTime2, а передаваемое значение было в строковом формате.

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

...