Ошибка: 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.
Добавим в таблицу новую запись, при этом значение оставим пустым.
INSERT INTO `MyTestTable` (`date`) VALUES ('');
Так как мы не указали значение для колонки 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.
Читайте также: