2

当运行托管在 IIS 中的 ac# web 服务时,它在我使用 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。

我在 Windows 7 上运行 MySQL 服务器版本 5.5 x64,它尝试将值保存到的数据类型是 DateTime,如错误消息所示。有没有其他人遇到过这个问题?

4

1 回答 1

1

我遇到了同样的问题,而且似乎以前版本的 ODBC 连接器(5.1.10 和更早版本)对 C# DateTime 字段的处理方式非常不同。可能是连接器的早期版本只是截断了足够多的 DateTime 以使其在 MySQL 中工作,而当前版本保留了更多的小数数据。

我还注意到一些奇怪的行为,Decimal变量完全使连接器崩溃,没有描述性错误消息。我的解决方案是改用Double类型。

编辑 我发现了我不久前看到的 ODBC/Connector v5.1.11 的变更日志,它确认了 Bugs Fixed 列表中值的不同处理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方法aDateTime并将字符串传递给 MySQL:

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

参考资料:
如何从 .NET DateTime 中截断毫秒数
为什么 MySQL 不支持毫秒/微秒精度?
ODBC 连接器 5.1.11 更新日志

于 2013-02-06T10:28:53.397 回答