Ошибка: Unable to convert MySQL date/time value to System.DateTime

В комментариях многие жалуются, что у них при работе с базой данных Mysql возникает ошибка: Unable to convert MySQL date/time value to System.DateTime и просят подсказать или показать, как можно решить данную проблему.

Возникновение ошибки

Рассмотрим возникновение данной ошибки на простой примере.

Предположим, что у нас есть база данных MyDB, в которой содержится пустая таблица MyTestTable, с одной колонкой date.

Колонка date хранит дату (формат 0000-00-00) и имеет тип Date.

тип date

Добавим в таблицу новую запись, при этом значение оставим пустым.

колонка date

Так как мы не указали значение для колонки date, то ей (по умолчанию) было установлено значение: 0000-00-00.

Теперь попробуем получить значение из таблицы, для этого создадим метод GetDate.

Более подробно о реализации данного метода можно прочитать в статье: Работа с базой данных Mysql

Выполним метод

При попытке загрузить полученные данные в объект DataTable (строка: dt.Load(dr)) возникает исключение: Unable to convert MySQL date/time value to System.DateTime.

Решение проблемы

Когда мы создаем строку подключения к базе данных Mysql, в данном примере для этого используется объект типа MySqlConnectionStringBuilder, то в ней мы обычно перечисляем различные опции или параметры, например, такие как имя базы данных, имя пользователя, пароль и так далее.

Но, кроме этих параметров, так же строка подключения содержит и некоторые другие параметры, которые мы хотя и не указываем явно, но они все равно передаются в строке подключения с уже установленными (по умолчанию) значениями.


Наш канал в telegram канал codeby

Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде !  Подробнее ...

Так, например строка подключения содержит два дополнительных параметра: AllowZeroDateTime и ConvertZeroDatetime, которые (по умолчанию) имеют значение false, например:

В объекте типа MySqlConnectionStringBuilder эти же параметры представлены в виде свойств:

А теперь посмотрим, что происходит, когда мы пытаемся получить нулевую дату при установленных значениях: false и true.

Для большей наглядности внесём небольшое изменение в содержимое метода GetDate:

было

стало

И так посмотрим, какие результаты дают методы: GetDateTime и GetValue.

AllowZeroDateTime

Если установлено значение false (AllowZeroDateTime = false) , то для всех валидных значений, например: 12.12.2013 возвращается объект типа System.DateTime, а для не валидных значений, например, таких как нулевая дата (00.00.0000) или дата и время, исключение.

Если установлено значение true (AllowZeroDateTime = true), то в таком случае для всех валидных значений будет также возвращаться объект System.DateTime, а для всех не валидных значений, которые также ещё называют «запрещенные значения» (в данном случаи — это нулевая дата) объект типа MySqlDateTime.

ConvertZeroDatetime

По умолчанию так же имеет значение false (ConvertZeroDatetime = false), при котором всегда возвращается исключение для всех запрещенных значений.

Значение true (ConvertZeroDatetime = true) возвращает значение: DateTime.MinValue, которое имеет вид: 01.01.0001 0:00:00, если в колонке содержится нулевая дата или пара: дата и времени.

В нашем примере оба параметра имеют значения FALSE, поэтому в результате мы получаем исключение. Чтобы это исправить, установим значение true для параметра ConvertZeroDatetime.

Читайте также:


Чат codeby в telegram перезагрузка

Обсуждаем вопросы информационной безопасности, методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие.  Подробнее ...

Похожие темы

Введение в хранимые функции MySQL 5... Хранимые процедуры MySQL (часть 2) В этой части статьи допишем начатую в предыдущей статье хранимую процедуру и научимся создавать хранимые mysql фун...
Как проверить количество MySQL соединений на Linux... Чтобы посчитать текущие MySQL соединения сервера MySQL, используйте этот трюк командной строки Linux. Подразумевается, что вы уже на хосте Linux...
Вызов хранимой процедуры на клиенте... Вызов хранимой процедуры MySQL на клиенте В этой статье добавим возможность вызова хранимой процедуры из нашего клиентского приложения. Для начала...
Работа с СУБД MySQL в C# Работа с базой данных MySQL в C# Рассмотрим простенькую задачку. У нас есть сайт, управление, которым осуществляется с помощью cms WordPress, а все д...
Как проверить тип системы хранения MySQL на Linux ... Узнать тип системы хранения MySQL на Linux Используются две основные системы хранения MySQL: MyISAM и Innodb. MyISAM является не транзакционной,...