У меня есть приложение C#, которому необходимо вставить текущее datetime в поле datetime в базе данных MySQL. Как мне этого добиться?
Я использую MySQL Connector / NET 6.9.9. Ниже то, что я пробовал до сих пор. data.currentDateTime относится к типу MySqlDateTime.
Ожидаемый результат в базе данных - правильное datetime, однако фактическое значение - 0000-00-00 00:00:00.
// Set up data object and add datetime
MyData data = new MyData();
data.currentDateTime = new MySqlDateTime(DateTime.Now);
// Insert into database
try
{
MySqlConnection conn = getMySqlConnection();
conn.Open();
MySqlCommand cmd = new MySqlCommand(@"
INSERT INTO my_data (`current_datetime`)
VALUES (@currentDateTime)
", conn);
log.Debug(data.currentDateTime); // correct timestamp
cmd.Parameters.AddWithValue("currentDateTime", data.currentDateTime);
cmd.ExecuteNonQuery();
// Value in the database is 0000-00-00 00:00:00
} catch (Exception e) {
// Hnadle exception
}
MyData класс:
public class MyData
{
public int id { get; set; }
public MySqlDateTime currentDateTime { get; set; }
// Other fields
public MyData()
{
// Empty constructor
}
}





Вы столкнулись с вариантом Ошибка MySQL 91199.
При использовании Режим SQL по умолчанию сервер MySQL отклонит неверный MySqlDateTime, сериализованный Connector / NET с ошибкой Incorrect datetime value.
Однако, если на вашем сервере MySQL не включены NO_ZERO_DATE и строгий режим, то попытка вставить MySqlDateTime будет «успешной», но вставленное значение будет 0000-00-00 00:00:00.
Поскольку ошибка 91119 был неправильно закрыт как дубликат, это вряд ли скоро будет исправлено. В качестве обходного пути вы можете рассмотреть возможность перехода на MySqlConnector, альтернативу OSS для Connector / NET, которая исправляет это (и многие другие ошибки).
Чтобы обойти это с помощью MySql.Data, добавьте базовый DateTime в качестве значения параметра вместо объекта MySqlDateTime:
cmd.Parameters.AddWithValue("currentDateTime", data.currentDateTime.GetDateTime());
Обратите внимание, что это вызовет MySqlConversionException, если MySqlDateTime не может быть преобразован в DateTime; если это может произойти в вашем коде, вам нужно протестировать data.currentDateTime.IsValidDateTime и сделать что-нибудь еще, если это false.
Вау, спасибо, это сводило меня с ума. Есть ли другой обходной путь, помимо использования MySqlConnector? Это зависит от .NET 4.5, а мы застряли на 4.0.
@ user2181948 Добавил обходной путь для MySql.Data внизу моего ответа.
@mjwills Хорошо, извините за путаницу - я только что попробовал
new MySqlDateTime(DateTime.Now), и нет никаких исключений, однако значение в базе данных - 0000-00-00 00:00:00. Но при печати на C# значение - это фактическая дата и время.