【问题标题】:Routine to compare new and old string values, maintain old data if nothing new例程比较新旧字符串值,如果没有新数据则维护旧数据
【发布时间】:2015-09-16 19:57:14
【问题描述】:

我有一个表单,允许用户输入新数据作为记录。为了保持数据完整性,我将所有预先存在的数据(如果有)复制到记录中,并仅覆盖用户添加了新数据的那些字段。这条新记录被保存到数据库中,旧记录被删除。

我只是想找到最有效的方法来遍历每个字段:

  • 确定是否有当前数据需要维护
  • 要覆盖的新数据

我需要为字符串、十进制、日期和整数编写相同类型的检查(均可为空)

这是我的字符串检查

 Private Function CreateRecordforSubmission() As Business.Casualty

    Dim c As Business.Casualty = Casualty

    c.alias = CheckStringValues(c.alias, txtAlias.Text.Trim())
    Return c

End Function
Private Function CheckStringValues(OldValue As String, newValue As String) As String

    If Not OldValue Is Nothing AndAlso Not String.IsNullOrEmpty(newValue) Then

        '<-- There is NEW DATA
        If Not String.IsNullOrEmpty(newValue) Then
            Return newValue
        Else
            '<-- No NEW DATA, check of there is CURRENT DATA to maintain
            If Not OldValue Is Nothing Then
                Return OldValue
            Else
                Return String.Empty
            End If
        End If

    Else
        '<-- NO CURRENT DATA AND no changes have been made
        Return String.Empty
    End If

End Function

【问题讨论】:

  • 不幸的是,我将被转移到另一个日期更紧迫的项目,因此我无法对已发布的代码发表评论。 TIA

标签: asp.net vb.net


【解决方案1】:

了解 CSLA 是如何做到的。对象中的每个属性都可以进行比较,如果设置器检测到更改或新值,则可以更新变量并将对象标记为已修改。

Public Property Alias As String
    Get
        Return _alias
    End Get
    Set(ByVal value As String)
        If Not String.IsNullOrEmpty(value) AndAlso _alias <> value Then
            _alias = value
            _objectWasModified = True
        End If
    End Set
End Property

If 语句可以在基类或辅助类中。

如果你想拥有其他类型的通用函数,这里有一个例子。这假设您使用的是可为空的值。

Public Property Number As Integer?
    Get
        Return _number
    End Get
    Set(ByVal value As Integer?)
        If Not IsNullOrSame(Of Integer)(_number, value)Then
            _number= value
            _objectWasModified = True
        End If
    End Set
End Property

Public Function IsNullOrSame(Of T As Structure)(ByVal oldValue As Nullable(Of T), ByVal newValue As Nullable(Of T))

    If newValue.HasValue Then
        If Not oldValue.HasValue OrElse Not oldValue.Value.Equals(newValue.Value) Then
            Return False
        End If
    End If

    Return True
End Function

【讨论】:

  • 虽然你的提议不错,但它并没有回答这里的主要问题:如何解释所有列出的类型的空值?通过假设除了Nothing 之外,每种类型都有其特殊的类似空的值。例如:0 代表 IntegerDecimal。即:如何将IsNullOrEmpty应用于不同于String的类型?
  • @varocarbas 0 与 null 不同。如果你想要一个空整数,它必须是一个可以为空的类型,并且所有可以为空的类型都具有 HasValue 作为它们的属性。
  • 逻辑上(这对任何人来说都很明显),但在所问问题的上下文中是相同的。这就是使用IsNullOrEmpty 的原因:您不仅要查找空值(Nothing),还要查找给定类型中通常假定为空的内容(例如,空字符串)。 OP 的目的是将这种功能扩展到其他类型。 Decimal/Integer 中空字符串的等价性为零。因此,您根本没有回答这个问题(即,我如何修改此函数以考虑其他类型?),但提出了一个非请求的替代方案。
  • @varocarbas 这是一个非常大的假设,我见过他们认为 -1 为空/空而不是 0 的系统。在他在问题中指定之前,我不会更改任何内容。他的“问题”实际上没有问号,我们不知道他是否真的希望我们更新他的功能以处理其他类型,或者他是否只是想要一个更好的替代他目前正在做的事情,这就是我我给他(并按照问题的标题)。如果你认为我没有正确回答,你可以写一个,我会投赞成票。
  • 我的意思是……无论 OP 想要什么。很明显,IsNullOrEmpty 不仅仅包含空值,而且问题指出“我需要为字符串、十进制、日期和整数编写相同类型的检查”。我认为您的回答有道理,但需要进行一些调整才能正确解决这里的问题。 PS:我确实写了我的答案,但删除了它(如果您的代表高于 10K,您现在可以看到它:))因为我改变了主意(原因无关紧要)。另外如上所述,您提出了一个有效的观点,只需要考虑所有涉及的问题(= 扩展一点)。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多