1

VB2005 Web アプリを VB2008 に移植していますが、コンパイルで問題が発生しています。

この問題は、プロジェクトをコンパイルしようとすると発生します。行に次のエラーが表示されます。

If m Is DBNull.Value...

エラー:

'Is' operator does not accept operands of type 'Integer'. 
Operands must be reference or nullable types.

コード:

Public Shared Function getNextID(ByVal t As String, ByVal f As String)

        Dim m = 0

        Dim c As New Data.SqlClient.SqlConnection
        c = getConn()
        c.Open()

        Dim s As String
        s = "SELECT MAX(" & f  & ")AS max FROM " & t

      Dim q As New Data.SqlClient.SqlCommand(s, c)
        Dim r = q.EmecuteReader

        While r.Read
            m = r.GetValue(0)
        End While

        If m Is DBNull.Value Then
            m = 1
        Else
            m += 1
        End If

        r = Nothing
        q = Nothing
        c.Close()
        c = Nothing

        Return m

End Function

この関数を変更せずに動作させる方法はありますか? そうでない場合は、どうすれば修正できますか?

4

3 に答える 3

3

あなたの問題は次の行です:

Dim m = 0

VS2005 で動作した理由Option Strictは がオフになっているためだと思われるため、 のタイプはmデフォルトでObject. つまり、VS2005 ではOption Strict Off、上記の行は次のようになります。

Dim m As Object = 0

mがオブジェクトの場合、それによって参照されるすべての値がboxedなるため、Is操作が許可されます。ただし、VS2008プロジェクトでは、それOption Inferがオンになっていると思われます(2005年には存在しなかった機能)。したがって、の型は、整数リテラル( )と等しく設定されているためm、コンパイル時に an であると推測されます。つまり、VS2008 では、上記の行は次のようになります。IntegerDim m = 0Option Infer On

Dim m As Integer = 0

Integer型ではなく型として宣言されているため、演算子Objectを使用することはできません。Isこれについての詳細は、MSDN のこのページで見つけることができます。ここでは、この例が示されています。

薄暗い数量 = 5

  • Option Infer がオン (デフォルト) の場合、変数は初期化子のデータ型を取ります。ローカル型推論 (Visual Basic) を参照してください。
  • Option Infer がオフで Option Strict がオフの場合、変数は Object のデータ型を取ります。
  • Option Infer がオフで Option Strict がオンの場合、コンパイル時エラーが発生します。

この問題を解決する最も簡単な方法はOption Infer Off、VS2005 と同じ方法でコンパイルされるようにすることです。ただし、そのままOption Infer Onにしてコードを修正する場合は、変数の型を次のように指定する必要があります。

Dim x As Object = 0

if をチェックする方法を変更することで修正できると思うかもしれませんm Is DBNull。たとえば、次の行のいずれかがコンパイルされます。

If Convert.IsDBNull(m) Then

または:

If TypeOf m Is DBNull Then

Ifただし、これら 2 つのステートメントのどちらも true に評価されないことに気付くでしょう。mが として宣言されている場合Integer、 になることはありませんDBNullDbNullデータベースの列が null に等しい場合、次の行はオブジェクトをInteger不可能なにキャストしようとするため、例外をスローします。

m = r.GetValue(0) ' This will throw exception if column is null and m is an integer

変数が anまたはobjectmのいずれかと等しいことをサポートする唯一の方法は、変数が として宣言されている場合です。IntegerDbNullObject

このようにタイプが指定されていない箇所がプロジェクトに多い場合は、オフにする必要がありますOption Infer。問題のある場所をすべて見つけて、コード内ですべて修正してからOption Infer再度オンにする場合は、一時的に をオンにしてOption Infer OffからオンにすることができますOption Strict OnOption Strictがオンでオフの場合Option Infer、すべての変数の型が常に指定されていない限り、プロジェクトはコンパイルされません。

于 2013-01-29T02:39:16.337 に答える
0

変数mをnullabaleにするだけです

  Dim m As Nullable(Of  Integer)
于 2013-01-29T11:21:50.517 に答える
0

You could eliminate the problem at the database query stage with something like

SELECT COALESCE(MAX(" & f & "), 0) AS max FROM " & t

and then unconditionally increment m.

Also, you could use ExecuteScalar instead of ExecuteReader, seeing as you are only getting one value.

于 2013-01-29T11:14:53.810 に答える