Вставка значения MySqlDateTime из C# в базу данных MySQL

У меня есть приложение 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
        }
    }

@mjwills Хорошо, извините за путаницу - я только что попробовал new MySqlDateTime(DateTime.Now), и нет никаких исключений, однако значение в базе данных - 0000-00-00 00:00:00. Но при печати на C# значение - это фактическая дата и время.

user2181948 24.07.2018 07:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
264
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы столкнулись с вариантом Ошибка 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 24.07.2018 23:19

@ user2181948 Добавил обходной путь для MySql.Data внизу моего ответа.

Bradley Grainger 24.07.2018 23:23

Другие вопросы по теме