2

我正在尝试做一些类似于这里描述的事情,但使用可以为空的类型。

http://www.csharp-station.com/Tutorials/Lesson23.aspx

int availableUnits = unitsInStock ?? 0;

在 VB 中,它会是这样的:

Dim availableUnits As Int32 = If(unitsInStock, 0)

但是,我正在使用可能是 DbNull 的 db 列和可以为 Nothing 的可为空类型(这与 DbNull 不同)。如果一列是DbNull,我想返回Nothing,否则返回值。例如:

Dim availableUnits As Int32? = If(myDataReader("UnitsInStock").Value, Nothing)

我得到的错误是“指定的演员表无效”,但我不知道为什么。我也试过这个:

Dim availableUnits As Int32? = If(isDbNull(myDataReader("UnitsInStock").Value), myDataReader("UnitsInStock").Value, Nothing)

这很混乱,只会导致同样的错误。唯一有效的是:

Dim availableUnits As Int32?
If isDbNull(myDataReader("UnitsInStock").Value) Then
  availableUnits = myDataReader("UnitsInStock").Value
Else
  availableUnits = Nothing
End If

这很愚蠢。有没有更好的方法可以将可空数据库值转换为我不知道的可空变量?

4

3 回答 3

3

如果您可以选择使用 DataSets 而不是 DataReaders,则DataRow.Field方法知道如何正确处理 Nullable 变量:

Dim availableUnits = myDataRow.Field(Of Int32?)("UnitsInStock")
于 2011-12-08T19:52:01.803 回答
1

这很愚蠢,但是您必须在Nothing设置时强制转换:

Dim availableUnits As Int32? = If(myDataReader.IsDBNull("UnitsInStock"), _
                                  CType(Nothing, Int32?), _
                                  myDataReader.GetInt32("UnitsInStock"))
于 2011-12-08T19:49:50.300 回答
0

正如我在一个非常相似的问题中提到的那样,最好不要Nothing在这里使用,而是New Int32?

Dim availableUnits = If(myDataReader.IsDBNull("UnitsInStock"), _
                              New Int32?, _
                              myDataReader.GetInt32("UnitsInStock"))
于 2014-03-07T15:49:24.240 回答