VB.NET: Как мне использовать объединение со значениями столбцов БД и обнуляемыми типами? Или есть лучшее решение? - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь сделать что-то похожее на то, что описано здесь, но с обнуляемыми типами.

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

int availableUnits = unitsInStock ?? 0;

В VB это было бы так:

Dim availableUnits As Int32 = If(unitsInStock, 0)

Однако я работаю со столбцами db, которые могут быть DbNull, и типами, допускающими нулевые значения, которые могут быть 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

Что просто глупо.Есть ли лучший способ получить значения db, допускающие значения NULL, в переменные, которые я не знаю?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Если вам удобнее использовать DataSets вместо DataReaders, метод DataRow.Field знает, как правильно обрабатывать переменные Nullable:

Dim availableUnits = myDataRow.Field(Of Int32?)("UnitsInStock")
1 голос
/ 08 декабря 2011

Это глупо, но вы должны разыграть Nothing, когда вы установите его:

Dim availableUnits As Int32? = If(myDataReader.IsDBNull("UnitsInStock"), _
                                  CType(Nothing, Int32?), _
                                  myDataReader.GetInt32("UnitsInStock"))
0 голосов
/ 07 марта 2014

Как я упоминаю в том, что оказывается очень похожим вопросом , вам лучше не использовать Nothing здесь, а скорее New Int32?:

Dim availableUnits = If(myDataReader.IsDBNull("UnitsInStock"), _
                              New Int32?, _
                              myDataReader.GetInt32("UnitsInStock"))
...