我第一次尝试使用Dapper,但是我立刻遇到了问题,因为看起来Dapper似乎无法处理可空字段。这让我感到非常惊讶,因为这些非常普遍。
如果我的SQL Server数据库中有一个可以为空的布尔字段并尝试使用Dapper来填充我的C#类上的可空布尔属性,那么如果布尔字段包含空值,则抛出异常:
System.FormatException: String was not recognized as a valid Boolean.
是否有任何修复或解决方法?我发现很难相信Dapper无法解决这个问题,因为它看起来已经存在了一段时间,这是一个非常基本的功能。
编辑:这是我的错!我的专栏实际上是一个nvarchar,恰好包含0或1,因此我没有注意到。将其更改为BIT(或将C#属性更改为" string?")可以解决问题。
答案 0 :(得分:7)
是的,工作得很好:
public void SO24607639_NullableBools()
{
var obj = connection.Query<HazBools>(
@"declare @vals table (A bit null, B bit null, C bit null);
insert @vals (A,B,C) values (1,0,null);
select * from @vals").Single();
obj.IsNotNull();
obj.A.Value.IsEqualTo(true);
obj.B.Value.IsEqualTo(false);
obj.C.IsNull();
}
class HazBools
{
public bool? A { get; set; }
public bool? B { get; set; }
public bool? C { get; set; }
}
答案 1 :(得分:0)
由于Dapper没有做太多管道,因此来自数据库的记录集包含一个字符串,由错误表示。尝试检查列类型,当它清楚时,您可以相应地更改DTO类,或者在查询中以某种方式将其强制转换。