【问题标题】:Assigning nothing to double from reader with no data [duplicate]在没有数据的情况下从阅读器中分配任何内容以加倍 [重复]
【发布时间】:2013-10-16 13:15:11
【问题描述】:

注意:此问题不仅仅与 Null 值有关,它更具体地与非双精度值有关,并通过读取器转换赋值来处理它们。

在阅读器在 Convert... 上引发错误之前,寻找一种方法来检查此阅读器值中的空白或非双精度值。

Dim Load_Pc As Double = Convert.ToDouble(reader("Load_Pc"))

如果阅读器为空白或无法处理该值,是否有某种方法可以不为 Load_Pc 分配任何内容?

【问题讨论】:

  • Load_Pc是什么类型?

标签: vb.net


【解决方案1】:

既然你说“空白”,我假设列的实际类型是string

然后你可以使用Double.TryParse 或者检查它是空还是空

Dim ordinalIndex = reader.GetOrdinal("Load_Pc")
Dim Load_Pc As Double = Double.MinValue
If Not reader.IsDbNull(ordinalIndex) Then
    Dim loadPC As String = reader.GetString(ordinalIndex)
    If Not String.IsNullOrWhiteSpace(loadPC) Then
        Load_Pc = Double.Parse(loadPC)
    End If 
End If

这里是TryParse 方法:

Double.TryParse(reader.GetString(ordinalIndex), Load_Pc)

但是,如果可能,您应该始终存储正确的类型,切勿将 string/varchar 用于数值或 DateTime。那么它会更高效,更不容易出错:

Dim Load_Pc As Double = reader.GetDouble(ordinalIndex)

如果您想改用Nullable(Of Double)

Dim Load_Pc As Double? = Nothing
Dim dLoad_Pc As Double
If Double.TryParse(reader.GetString(ordinalIndex), dLoad_Pc) Then
    Load_Pc = dLoad_Pc
End If

【讨论】:

  • 谢谢,如果双重转换失败,是否可以创建一个可为空的并仅将空加载到数据库?
  • 加载 DB? load a null to the db
  • 意图是将 DBNull 发送到 DB 表或 Nothing,以便在 DB 表中不存储该字段的值。
  • @htm11h:我已经编辑了我的答案以展示如何改用Double?。但是,由于DataReader 通常用于读取值而不是写入值,因此不清楚您希望如何在数据库中插入/更新值。您使用什么来插入/更新字段,DataTableDataAdapter 或其他什么?
  • 这里的 Reader 进程正在处理 Excel 导入,然后我将值(参数化)发送到数据库。
【解决方案2】:

Double,答案是否定的。

但是,使用Double?,答案是肯定的。更多信息请查看nullable types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2011-01-20
    • 2021-06-04
    相关资源
    最近更新 更多