Dapper 将 DbNull 转换为空字符串

Dapper convert DbNull to empty string

提问人:Vincent 提问时间:10/4/2023 最后编辑:Vincent 更新时间:10/4/2023 访问量:77

问:

我正在重构一些使用反射将 SqlCommand 映射到模型的代码。新代码使用 Dapper 框架,工作得很好:

    Public Shared Function GetModel(Of T As New)(cmd As SqlCommand) As T
        Try

            Dim params = GetParametersDictionary(cmd)
            Dim result As Object

            Using conn As New SqlConnection(ConnectionString)
                result = conn.Query(Of T)(cmd.CommandText, params).FirstOrDefault()
            End Using

            Return result

        Catch ex As Exception
            ErrorsLogger.LogException(ex)
            Throw
        End Try
    End Function

但是,在旧代码中,我有一个字符串属性和 DbNull 值的边缘情况。像这样:

    If IsTypeOfString(prop) AndAlso IsDbNull(value) Then
        prop.SetValue(obj, "")
    End If

新代码不会将 DbNull (NULL) 值转换为空字符串。相反,它使值没有设置,也就是 Nothing,从而破坏了其他地方的一些代码。

所以我的问题是如何更改此函数以将 NULL 值转换为空字符串?最好没有反射。

尝试/考虑/限制的事情:

  • 自定义 Dapper SqlMapper:当值为 NULL 时不起作用。
  • 自定义模型映射器:无法为每个模型类型创建自定义模型映射器。
  • 在类构造函数中将字符串初始化为 “”:无法保证每个字符串属性都正确初始化为 “”。
  • 无法更改查询或模型类(至少目前是这样)。
C# .NET vb.net dapper sqlcommand

评论

0赞 Richard 10/4/2023
怎么样,在SQL的子句中使用,而不是一般地处理这个问题。(恕我直言,当数据库中有空值时,具有不可为空属性的模型很奇怪。selectCoalesce(column, '') as column
0赞 Vincent 10/4/2023
完全同意。不幸的是,我必须处理这些旧代码,并且无法访问模型或查询。更新了问题以添加此约束。
0赞 Olivier Jacot-Descombes 10/4/2023
我从未使用过 dapper,但您可能可以为字符串创建一个类型处理程序。下面是一个类型处理程序的示例,它不能完全满足您的需求,但您可以对其进行调整:将 varchar 转换为 IHtmlString
0赞 Vincent 10/4/2023
@OlivierJacot-Descombes 不幸的是,由于 dapper 的工作方式,CustomTypeHandler(又名 Dapper SqlMapper)不会为 NULL 值调用。

答:

2赞 Marc Gravell 10/4/2023 #1

Dapper 认为 和 是不同的东西,并积极尝试不将两者混为一谈。也许,您可以对结果进行后处理。null""

评论

1赞 Vincent 10/4/2023
还行。这将是后期处理......至少现在是这样。我将记录/查找依赖于此空字符串代码的代码,并在那里修复它。
2赞 Marc Gravell 10/5/2023
@Vincent您也可以让它默认为空字符串?public string Whatever {get;set;} = "";