前陣子同僚寫代碼時發現MySQL資料表中經常被神奇的插入了空值,跟蹤了半天代碼,終于發現了問題所在:
DbParameter p = new MySqlParameter("@val", 0);
Debug.Assert(p.Value == 0); // 這裡斷言失敗,p.Value實際是null
分析了半天,沒找到原因。猜想是MySql.Data把0當作null來處理了。心想,這不應該啊,完全沒理由的事情啊,0在資料庫裡是個多麼正常不過的值啊!心有不甘,于是把MySql.Data的源代碼下載下傳下來調試跟蹤……然後發現了一個不得了的事情
MySqlParameter有幾個建構函數,其中有兩個是這麼申明的
public MySqlParameter(string name, object value) {
// ......
}
public MySqlParameter(string name, MySqlDbType type) {
// MySqlDbType是個枚舉類型
p = new MySqlParameter("@val", 0)實際是調用的是第二個建構函數,0被轉換成MySqlDbType.Decimal傳進去了,沒有為其Value指派,理所當然的p.Value為null。
那麼,豈不是傳入的整數都會被當作枚舉……不然,如果傳入的非0,調用的卻又是第一個建構函數,1是被當作object來處理的!
然後我很疑惑,為什麼0會被自動轉成枚舉類型來處理,而非0則會被當作object呢?為什麼為什麼為什麼?誰能告訴我答案?
疑惑歸疑惑,問題是解決了……
DbParameter p = new MySqlParameter("@val", (object) 0);
Debug.Assert(p.Value == 0); // 斷言成功
本文轉自邊城__ 51CTO部落格,原文連結:http://blog.51cto.com/jamesfancy/1162445,如需轉載請自行聯系原作者