天天看點

為什麼new MySqlParameter("@val", 0).Value == null?

前陣子同僚寫代碼時發現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,如需轉載請自行聯系原作者

繼續閱讀