Unable to convert MySQL date-time value to System.DateTime

Ошибка: 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

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

INSERT INTO `MyTestTable` (`date`) VALUES ('');

колонка date

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

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

private void GetDate()
{
DataTable dt = new DataTable();
MySqlConnectionStringBuilder mysqlCSB;
mysqlCSB = new MySqlConnectionStringBuilder();
mysqlCSB.Server = "127.0.0.1";
mysqlCSB.Database = "MyDB";
mysqlCSB.UserID = "adminBD";
mysqlCSB.Password = "123";
string queryString = @"SELECT date FROM MyTestTable";
using (MySqlConnection con = new MySqlConnection())
{
con.ConnectionString = mysqlCSB.ConnectionString;
MySqlCommand com = new MySqlCommand(queryString, con);
try
{
con.Open();
using (MySqlDataReader dr = com.ExecuteReader())
{
if (dr.HasRows)
{
dt.Load(dr);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

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

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

private void button1_Click(object sender, EventArgs e)
{
GetDate();
}

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

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

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

string conStr = @"Server=127.0.0.1;Uid=adminBD;Pwd=123;Database=MyDB;

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

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

string conStr = @"Server=127.0.0.1;Uid=adminBD;Pwd=123;
Database=MyDB; Allow Zero DateTime = false;
 Convert Zero Datetime = false;

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

mysqlCSB.AllowZeroDateTime = false;
mysqlCSB.ConvertZeroDatetime = false;

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

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

было

if (dr.HasRows)
{
dt.Load(dr);
}

стало

using (MySqlDataReader dr = com.ExecuteReader())
{
while (dr.Read())
{
DateTime date = dr.GetDateTime("date");
object objDate = dr.GetValue(0);
}
}

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

AllowZeroDateTime

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

//1. Исключение
DateTime date = dr.GetDateTime("date");
//2. Исключение
object objDate = dr.GetValue(0);

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

1. Исключение
2. Значение: 00.00.0000 (тип MySqlDateTime)

ConvertZeroDatetime

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

1. Исключение
2. Исключение

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

1. 01.01.0001 0:00:00
2. 01.01.0001 0:00:00

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

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

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*