Dapper可以处理可空的布尔/位字段吗? [无效]

时间:2014-07-07 09:47:54

标签: c# sql-server orm dapper

我第一次尝试使用Dapper,但是我立刻遇到了问题,因为看起来Dapper似乎无法处理可空字段。这让我感到非常惊讶,因为这些非常普遍。

如果我的SQL Server数据库中有一个可以为空的布尔字段并尝试使用Dapper来填充我的C#类上的可空布尔属性,那么如果布尔字段包含空值,则抛出异常:

System.FormatException: String was not recognized as a valid Boolean.

是否有任何修复或解决方法?我发现很难相信Dapper无法解决这个问题,因为它看起来已经存在了一段时间,这是一个非常基本的功能。

编辑:这是我的错!我的专栏实际上是一个nvarchar,恰好包含0或1,因此我没有注意到。将其更改为BIT(或将C#属性更改为" string?")可以解决问题。

2 个答案:

答案 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类,或者在查询中以某种方式将其强制转换。