【问题标题】:vb.net Date values being converted to timevb.net 日期值被转换为时间
【发布时间】:2016-07-29 14:17:14
【问题描述】:

我有以下代码来检查日期时间值是否为空或有值。如果它为空,我希望它作为一个空白字符串返回,否则它应该是它所包含的值的字符串。

语句的Else 部分有效,它将值转换为字符串,但是,如果作为日期时间传入的值为空,它不会返回Nothing,而是将值设置为'12:00:00 AM',这导致我在项目的其他地方出现问题。

如何调整此函数以使空日期时间值返回为空白字符串?

Public Shared Function dbToDate(o As Object) As DateTime

    If o Is DBNull.Value Then
        Return ""

    Else
        Return Convert.ToDateTime(o)

    End If
End Function

【问题讨论】:

  • 请告诉我你不打算把它放到 SQL 字符串中吗?因为那将是可怕。这是一个非常强烈的迹象,表明您正在构建极易受到 sql 注入攻击的代码。
  • 这与your last question 有何不同? ...并且日期仍然不需要转换为 SQL 的字符串。
  • @JoelCoehoorn 不,这不会进入 SQL 字符串,这是使用 SQL 从数据库中获取数据,但不会返回(还没有)
  • 查看其他评论中链接的问题,这正是你在做什么:(不要构建这样的 SQL 字符串! 它实际上是在乞求被黑。
  • @Plutonix 该问题要求提供导致检测到此错误的语法,这是解决问题的方法。而且这个问题现在有点多余,因为它不再在插入语句中使用

标签: sql vb.net string datetime null


【解决方案1】:

首先,DateTime 永远不会为空/无。因为它是一个值类型(Structure),所以它总是有一个值。在这种情况下,默认值为DateTime.MinValue。但是 VB.NET 会为您处理这种情况。 dt.Date = Nothing 将自动将该值与 Date.MinValue 进行比较,因此它可以按预期工作。

但问题是你返回dt.ToString。只需返回""

Public Shared Function sqlDate(dt As DateTime) As String    
    If dt.Date = Nothing Then  
        Return ""    
    Else    
        Return dt.ToString("yyyy-MM-dd")    
    End If    
End Function

这是一个没有方法的版本:

Dim result = If(dt = Nothing, "", dt.ToString("yyyy-MM-dd"))

您可以看到Date 使用此代码永远不会为空:

Dim dt As Date = Nothing
Console.WriteLine( dt = Nothing )' true
Console.WriteLine( dt = Date.MinValue )' true
Console.WriteLine( Object.ReferenceEquals(Nothing, dt) )' always false because it's a value type

更新 acc。您的最新编辑,与DbNull.Value 进行比较。我还会返回Nullable(Of Date)

Public Shared Function dbToDate(o As Object) As DateTime?
    If DbNull.Value.Equals(o) OrElse o Is Nothing Then
        Return Nothing
    Else
        Return Convert.ToDateTime(o)
    End If
End Function

【讨论】:

  • VB.Net Nothing 与 C# null 不同。 VB.Net 中的 DateTime 值可以是 Nothing,这也等同于 C# 的 default(T)
  • @JoelCoehoorn:真假。该值不会只是Date.MinValue。但是,如果您将其与Nothing 进行比较,您将得到True。您也可以分配Nothing。然后(在 C# 语法中)您将分配default(DateTime),即Date.MinValue。我只是想指出一个值类型永远不是null 或什么都没有(在相同的含义)。 OP 使用了这两个术语,因此重要的是要提及 VB.NET 中的差异(正如您所做的那样)。这是一个相关的问题。 stackoverflow.com/questions/15524045/…
  • @TimSchmelter 嗨,蒂姆,首先感谢您消除差异。其次,此函数仍在将 nothing 值转换为 12:00:00 AM?
  • @joe:那不可能,你用调试器看看会发生什么?
  • @TimSchmelter 重新构建解决方案后,它已自行解决,但现在它只是抛出错误“从类型字符串转换为日期无效”
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多