我收到了无效的强制转换异常,因为我的COALESCE正在处理数值数据类型值以及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,
答案 0 :(得分:1)
你必须施放整个表达式:
CAST(COALESCE((SELECT ...),(SELECT ...)) AS INT) AS StartingMembershipCount,
当子查询没有返回任何行时,SELECT中的CAST(或类型)不适用。
或者你可以“只”强制转换整个第一个子查询,因为第二个应该总是返回一个结果:
COALESCE(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount,
因为第二个总是返回一个结果,所以这根本不需要是NULL。使用ISNULL应该解决这个问题:
ISNULL(CAST((SELECT ...) AS INT), (SELECT ...)) AS StartingMembershipCount,
ISNULL的缺点是,如果需要,它不能支持第三个参数;这不标准。优点是结果不可为NULL,因此您可以直接使用GetInt32。
顺便说一句,当我在C#中得到异常时,我通常会暂时切换到r.GetValue(序号)以将值作为对象返回(当然,你不能将其赋值给int变量),然后检查它的类型。