Драйвер ODBC MySQL 5.2w вызывает ошибку datetime 5.1.10 работает нормально

При запуске веб-службы aC#, размещенной в IIS, она отлично работает, когда я использую драйвер MySQL 5.1.10, но при обновлении до последней версии драйвера 5.2 я получаю следующую ошибку

ERROR [HY000] [MySQL]ODBC 5.2(w) Driver][mysqld-5.5.28-log]Incorrect datetime value:      '2012-12-14 14:01:13.553000000' for column 'Date' at row 1

Я использую систему DSN.

Я использую сервер MySQL версии 5.5 x64 в Windows 7, и тип данных, в который он пытается сохранить значение, - это DateTime, как указано в сообщении об ошибке. Кто-нибудь еще сталкивался с этой проблемой?

1 ответ

У меня была та же проблема, и кажется, что предыдущие версии коннектора ODBC (5.1.10 и более ранние) имеют очень различную обработку полей C# DateTime. Может случиться так, что более ранние версии соединителя просто усекали достаточно DateTime, чтобы он работал в MySQL, в то время как текущая версия хранит больше дробных данных.

Я также заметил странное поведение с Decimal Переменные полностью разрушают соединитель без описательного сообщения об ошибке. Моим решением для этого было использовать Double типы вместо.

РЕДАКТИРОВАТЬ Я нашел журнал изменений, который я видел некоторое время назад для ODBC/Connector v5.1.11, и он подтверждает другую обработку DateTime значения в списке исправленных ошибок:

Дробные секунды часть метки времени игнорировалась в подготовленных инструкциях, использующих тип SQLBindParameter и SQL_C_TIMESTAMP. Например, подготовленный запрос, сравнивающий два значения меток времени, которые отличаются только дробной частью, будет считать значения идентичными. (Ошибка № 12767761, Ошибка № 60648)

Что забавно, так это то, что до тех пор, пока поля MySQL 5.6.4 DATETIME и TIMESTAMP имели точность только до секунд (без миллисекунд или микросекунд), поэтому "неправильное" поведение предыдущих версий соединителя игнорировало доли секунды, и MySQL был счастлив. Теперь, когда соединитель не игнорирует дробные данные, генерируется ошибка, если эти данные передаются через хранимую процедуру или подготовленный оператор. Таким образом, решение на данный момент является либо:

1) Обновление до MySQL 5.6 (сейчас GA)

2) Используйте аккуратную технику, чтобы убрать дробные данные из DateTime при этом сохраняя тип и все другие его атрибуты:

DateTime dt = DateTime.Now //Or any existing DateTime value
dt = dt.AddTicks( - (dt.Ticks % TimeSpan.TicksPerSecond));

3) Если вы не хотите иметь дело с нюансами C# и DateTime вводит типы и знает о возможных последствиях безопасности при использовании строковых данных при работе с базами данных, вы всегда можете создать собственную строку даты или использовать ToString метод DateTime и передать строку в MySQL:

// convert DateTime to string with formatting for MySQL
string dateformysql = mydatetime.ToString("yyyy-MM-dd HH:mm:ss");

Рекомендации:
Как обрезать миллисекунды от.NET DateTime
Почему MySQL не поддерживает точность в миллисекундах / микросекундах?
ODBC Connector 5.1.11 Список изменений

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