Драйвер 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 Список изменений