2

ここで説明されているのと同様のことをしようとしていますが、null許容型を使用しています。

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

int availableUnits = unitsInStock ?? 0;

VBでは、次のようになります。

Dim availableUnits As Int32 = If(unitsInStock, 0)

ただし、DbNullである可能性のあるdb列と、Nothing(DbNullとは異なる)である可能性のあるnull許容型を使用しています。列が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

これはばかげています。null許容db値を私が知らないnull許容変数に入れるより良い方法はありますか?

4

3 に答える 3

3

DataReaders の代わりに DataSets を使用するオプションがある場合、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 に答える