2012-08-17 40 views
0

在我的項目中,我必須從SQL中檢索大量數據並將數據映射到對象字段;是這樣的:SQL COALESCE與C中的DBNull檢查#

cu.UnitName = dr["UnitName"].ToString().Trim(); 
cu.LocalId = DbUtil.RemoveNull(dr["LocalID"], ""); 
cu.DatabaseName = DbUtil.RemoveNull(dr["DatabaseName"], ""); 
cu.DatabaseServer = DbUtil.RemoveNull(dr["DatabaseServer"], ""); 
cu.UserName = DbUtil.RemoveNull(dr["UserName"], ""); 
cu.Password = DbUtil.RemoveNull(dr["Password"], ""); 
cu.RoleId = DbUtil.RemoveNull(dr["RoleId"], 0); 

其中DbUtil.RemoveNull是以下(int版本,該版本string類似):

public static int RemoveNull(object data, int defaultValue) 
    { 
     if (data is DBNull || data == null) 
      return defaultValue; 
     return int.Parse(data.ToString()); 
    } 

所以我想如果SQL的COALESCEISNULL會做同樣的工作速度更快。有人做過類似的比較嗎?哪種方式更有效率?

+0

爲什麼不自己做比較? – 2012-08-17 07:01:48

+0

這種表現不會成爲一個問題。你應該採取任何看起來更容易維護的方法 – Lucero 2012-08-17 07:04:32

+0

嘗試'ISNULL'。看到這裏的原因(它的速度更快):http://stackoverflow.com/questions/2287642/which-is-quicker-coalesce-or-isnull – 2012-08-17 07:28:23

回答

0

而從數據庫返回的數據,你可以做

select COALESCE (data ,defaultValue) from table 

這將是更快,因爲沒有必要從前端代碼執行RemoveNull功能

0
cu.LocalId = dr["LocalId"] ?? ""; 
+0

你試過嗎?提示:'DBNull.Value!= null' – Lucero 2012-08-17 07:05:43

0

COALESCE」返回其參數中第一個非空表達式,所以你可能會使用ISNULL

在你的數據庫查詢中使用ISNULL會快得多。假設你有1m記錄,並且你調用了1m次C#方法,那肯定需要一些時間來執行。

另一方面,SQL引擎經過優化,可處理大量記錄。但是這不夠靈活。您不能使用一些複雜的邏輯並輕鬆更改默認值。

+0

查看我對該問題的最後一條評論。 – Azimuth 2012-09-28 12:42:49