2012-12-14 34 views
2

當運行IIS中託管的ac#web服務時,它運行完美時,我使用MySQL驅動程序5.1.10,但當我更新到最新的驅動程序5.2時出現以下錯誤MySQL ODBC驅動程序5.2w導致日期時間錯誤5.1.10工作正常

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,如錯誤消息所示。有其他人遇到這個問題嗎?

+0

我已經更新了我的答案與一些更多的細節。希望你會發現它的一些有用的。 – nextgentech

回答

1

我有過同樣的問題,並且似乎以前版本的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 techniqueDateTime剝離小數數據,同時仍保持的類型和它的所有其他屬性:

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

相關問題