我有過同樣的問題,並且似乎以前版本的ODBC連接器(5.1.10和更早版本)具有非常不同的處理C#DateTime字段。這可能是早期版本的連接器只是截斷了足夠的DateTime,使其在MySQL中工作,而當前版本保留更多的小數數據。
我也注意到一些奇怪的行爲,Decimal
變量完全崩潰連接器,沒有描述性的錯誤信息。我的解決方案是使用Double
類型。
編輯 我發現,我已經看到了一段時間後對ODBC /連接器v5.1.11的changelog,它證實了修復的錯誤列表中的不同處理DateTime
值:
小數秒部分的時間戳在使用SQLBindParameter和SQL_C_TIMESTAMP類型的預準備語句中被忽略。例如,比較僅在小數部分中不同的兩個時間戳值的準備查詢將考慮相同的值。 (錯誤#12767761,錯誤#60648)
有什麼好笑那就是直到MySQL 5.6.4 DATETIME和TIMESTAMP領域只有精確到秒(無毫秒或微秒),所以以前的版本中的「不正確」的行爲的連接器忽略了小數秒,MySQL很高興。現在連接器不會忽略小數數據,如果通過存儲過程或準備語句傳入此數據,則會生成錯誤。所以對於時刻該溶液可以是:
1)更新到MySQL 5.6(現在是GA)
2)使用neat technique從DateTime
剝離小數數據,同時仍保持的類型和它的所有其他屬性:
DateTime dt = DateTime.Now //Or any existing DateTime value
dt = dt.AddTicks(- (dt.Ticks % TimeSpan.TicksPerSecond));
3)如果您不想在所有處理的C#的細微差別和DateTime
類型,並知道使用數據庫時,使用字符串數據的潛在安全後果的,你總是可以建立自己的日期字符串或使用一個DateTime
的方法和字符串傳遞到MySQL:
// convert DateTime to string with formatting for MySQL
string dateformysql = mydatetime.ToString("yyyy-MM-dd HH:mm:ss");
參考文獻:
How to truncate milliseconds off of a .NET DateTime
Why doesn't MySQL support millisecond/microsecond precision?
ODBC Connector 5.1.11 Changelog
我已經更新了我的答案與一些更多的細節。希望你會發現它的一些有用的。 – nextgentech