当我遍历reader.GetBooleanVal循环时,当我点击reader.GetBooleanVal时所得到的错误是“指定的强制转换无效”。但在我的选择声明中,一切似乎都是正确的。不知道为什么我会得到这个例外。
我的目标是取决于我要返回的某个值--我正在更改另一列的结果,为什么我要使用case语句.任何帮助都将不胜感激。
List<CollectionCodeParameter> list = new List<CollectionCodeParameter>();
var sql = @"IF EXISTS (SELECT 1 FROM dbo.[collcode_Agency_Codes])
BEGIN
select
[collcode],
case when([collcode] = 'PIE') then 1
else 0
end as [fin_hold],
FROM[dbo].[collcode_Agency_Codes]
WITH(NOLOCK)
WHERE type = @AgencyType
END";
....code....
using (SqlDataReader reader = cmd.ExecuteReader())
{
var ordinals = reader.GetOrdinals();
while (reader.Read())
{
CollectionCodeParameter item = new CollectionCodeParameter();
item.FinancialHold = reader.GetBooleanVal(ordinals.GetOrdinal("fin_hold")).HasValue ?
reader.GetBooleanVal(ordinals.GetOrdinal("fin_hold")).Value : false; ;
list.Add(item);
}错误来自下面。我的fin_hold在我的表定义中有一点。
public static bool? GetBooleanVal(this SqlDataReader reader, int ordinal)
{
if (ordinal < 0) return null;
return reader.IsDBNull(ordinal) ? null : (bool?)reader.GetBoolean(ordinal);
}发布于 2020-02-20 21:40:09
它将帮助您调试解决您缩短的if语句,这样您就可以逐行调试它。
我现在无法尝试SQL,所以我不得不猜测:
在SQL中,case语句不是返回bit,而是返回int。
case when([collcode] = 'PIE')
then 1
else 0
end as [fin_hold],编辑:
我的fin_hold在我的表定义中有一点。
您不是返回您的列,而是从您的案例陈述中返回一个数字。别名as [fin_hold]与表定义无关。
试试这个:
case when([collcode] = 'PIE')
then Cast(1 as bit)
else Cast(0 as bit)
end as [fin_hold],https://stackoverflow.com/questions/60328562
复制相似问题