我遇到了同样的问题,而且似乎以前版本的 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 更新日志