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是一个对象,那么它引用的任何值都将被装箱,因此该Is操作将被允许。但是,在您的 VS2008 项目中,我怀疑它Option Infer已打开(2005 年不存在的功能),因此m在编译时推断类型为 an,Integer因为您将其设置为等于整数文字(Dim m = 0)。换句话说,在 VS2008 中,Option 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语句中的任何一个都不会评估为真。如果m被声明为Integer,那么它永远不会是DBNull。如果数据库中的列曾经等于 null,则以下行将引发异常,因为它会尝试将DbNull对象强制转换Integer为不可能的对象:

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

m变量支持等于 anInteger或object的唯一方法DbNull是,如果它被声明为Object.

如果项目有很多地方没有指定类型,像这样,你应该关闭Option Infer. 如果你想把所有出问题的地方都找出来,这样你就可以在代码里把它们都修好,然后再Option Infer开机,你可以暂时开机Option Infer Off再开机Option Strict On。当Option Strict打开和Option Infer关闭时,除非始终指定所有变量类型,否则项目将不会编译。

于 2013-01-29T02:39:16.337 回答
0

您可以使用类似的方法在数据库查询阶段消除问题

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

然后无条件地增加 m。

此外,您可以使用 ExecuteScalar 而不是 ExecuteReader,因为您只能获得一个值。

于 2013-01-29T11:14:53.810 回答
0

只需让您的变量 m 为空

  Dim m As Nullable(Of  Integer)
于 2013-01-29T11:21:50.517 回答