2015-08-31 30 views
2

我收到了無效的轉換異常,因爲我的COALESCE正在處理數字數據類型值和int數據類型值。正確的方法來解決在SQL Server中作爲INT的數字

查詢運行良好,但C#拋出無效的轉換異常。

我向我的COALESCE添加了一個強制轉換,但仍然收到無效的強制轉換異常。

問題:我是否可以在我的COALESCE中正確鑄造這個?

涉及錯誤的屬性聲明如下:

public int StartingMembershipCount { get; set; } 

發生錯誤的地方就在這裏

m.StartingMembershipCount = r.GetNullableInt32("StartingMembershipCount",0); 

我的數據助手定義爲:

public static int GetNullableInt32(this IDataRecord r, string name, int defaultValue) 
{ 
    var ordinal = r.GetOrdinal(name); 
    int returnVal = 0; 
    if (r.IsDBNull(ordinal)) 
     returnVal = defaultValue; 
    else 
     returnVal = r.GetInt32(ordinal); 


    return returnVal; 
} 

這裏是我的COALESCE(表達式1具有數字數據類型)

COALESCE((
-- Expression 1 
SELECT CAST(n.TOTAL_MBR AS INT) 
FROM 
usr_kiw_cus_certified n INNER JOIN 
(SELECT ClubId, min(AsOfDate) AsOfDate FROM 
    (SELECT ukm.MASTER_CUSTOMER_ID ClubId, ukm.AS_OF_DATE AsOfDate FROM usr_kiw_cus_certified ukm WHERE ukm.AS_OF_DATE > @StartDate AND ukm.master_customer_id = c.MASTER_CUSTOMER_ID) as temp 
GROUP BY ClubId) AS datetable 
ON datetable.ClubId = n.MASTER_CUSTOMER_ID and n.AS_OF_DATE = datetable.AsOfDate 
), 

-- Expression 2 
(SELECT COUNT(cr.MASTER_CUSTOMER_ID) 
FROM cus_relationship cr 
WHERE cr.RELATED_MASTER_CUSTOMER_ID = c.MASTER_CUSTOMER_ID 
AND cr.RELATIONSHIP_TYPE = 'employment' 
GROUP BY cr.RELATED_MASTER_CUSTOMER_ID 
)) AS StartingMembershipCount, 

回答

1

你要投的整個表達式:

CAST(COALESCE((SELECT ...),(SELECT ...)) AS INT) AS StartingMembershipCount, 

如果沒有行從子查詢返回時, CAST(或類型)在SELECT中不適用。

或者你也可以「只是」投了整個第一子查詢,因爲第二應該總是返回一個結果:

COALESCE(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount, 

由於第二總是返回一個結果,這真的不需要爲可以爲空的所有。使用ISNULL應該修復:

ISNULL(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount, 

ISNULL的缺點是,它不能支持第三個參數,如果你需要一個;這不是標準的。優點是結果不可空,所以你可以直接使用GetInt32。順便說一句,當我在C#中得到這個異常時,我通常會臨時切換到r.GetValue(ordinal)來返回值作爲對象(當然,您不能指定給一個int變量) ,然後檢查它的類型。

+0

很好的解釋。謝謝,這有幫助 – Slinky

相關問題