昨天遇到一個 System.Data.SQLite 的 bug,老實說我不是很肯定它是不是 bug,因為這個 bug 在 2005 年就有人提出,卻到現在都沒有解決,可能其實是個 feature 也不一定 :p
一般我們使用 SQLite 查詢資料後,會先用 HasRows 確定資料存在,然後用 Read() 開始讀,用 GetValue()、GetString()、GetDouble() 等方法取資料。但是當 SQL 查詢句中包含了 Aggregate Functions1 時,HasRows 便必為 true。如果實際上查詢結果是空的,GetValue() 取得的值就會是 DBNull.Value,GetString() 會取得空字串,而使用 GetDouble() 來取值則會發生錯誤,因為 null 無法隱含轉換為 double 型態。
這有許多 Workaround,例如用 GetValue() 取出後,先判斷是否為 DBNull.Value,不是的話再轉換為 double。最簡便的方法則是先使用 IsDBNull() 檢查欄位是否為 DBNull,不是的話才執行 GetDouble()。
-
例如 avg、count、max、min、sum 等。 ↩

