VB6:运行时错误'13':设置时键入不匹配,使用int键入int

时间:2009-05-08 16:00:51

标签: winapi vb6

我不是VB6编程的新手,但我也不是它的高手。希望有人可以帮我解决一个关于类型不匹配错误的问题,我试图用函数返回的int设置一个int变量。

我想要设置的整数定义为:

Global AICROSSDOCKStatus As Integer

现在,当我尝试拨打此电话时,我收到了运行时错误13

AICROSSDOCKStatus = ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "")

我已经逐步调试了行的程序行。 ProcessQuery函数获取并返回预期的整数,但是当要对AICROSSDOCKStatus进行赋值时,它会失败。

另外,我也试过对ProcessQuery做一个CInt(),结果相同。

有没有人对我的尝试有什么建议?

编辑: 这是ProcessQuery的定义

Function ProcessQuery(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer

编辑2:我无法告诉你为什么这样做。我继承了代码库。让人惊讶...


Function ProcessQuery(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer
    ProcessQuery = ProcessQuery1(icode, pb, TableName, sql$)
End Function

Function ProcessQuery1(icode As Integer, pb As ADODB.Recordset, TableName As String, sql$) As Integer
''THIS IS THE ORIGINAL SQL CALL ROUTINE!
Dim STATUS As Integer
On Error GoTo ProcessSQLError

STATUS = 0
Select Case icode
   Case BCLOSE
        If pb.State  0 Then
            pb.Close
        End If
        Set pb = Nothing
        STATUS = 3
    Case BOPEN
        STATUS = 9
        Set pb = New ADODB.Recordset
    Case BOPENRO
        STATUS = 9
        Set pb = New ADODB.Recordset
    Case BGETEQUAL, BGETEQUAL + S_NOWAIT_LOCK, BGETGREATEROREQUAL, BGETGREATEROREQUAL + S_NOWAIT_LOCK
        If pb.State  0 Then
            pb.Close
            ''Set pb = Nothing
            ''Set pb = New ADODB.Recordset
        End If
        pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic
        If Not pb.EOF Then
            pb.MoveFirst
        Else
            STATUS = 9
        End If
    Case BGET_LE, BGET_LE + S_NOWAIT_LOCK
        If pb.State  0 Then
            pb.Close
        End If
        pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic
        If Not pb.BOF Then
            pb.MoveLast

        Else
            STATUS = 9
        End If
    Case BGETFIRST, BGETFIRST + S_NOWAIT_LOCK
        If pb.State  0 Then pb.Close
        sql = "select * from " + TableName
        If InStr(1, gblOrderBy, "ORDER BY") > 0 Then
            sql = sql + gblOrderBy
        Else
            sql = sql + " ORDER BY " + gblOrderBy
        End If

        gblOrderBy = ""
        pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic
        If Not pb.EOF Then
                                                        pb.MoveFirst
        End If
    Case BGETLAST, BGETLAST + S_NOWAIT_LOCK
        If pb.State  0 Then
            pb.Close
        End If
        sql = "select * from " + TableName
        If InStr(1, gblOrderBy, "ORDER BY") > 0 Then
            sql = sql + gblOrderBy
        Else
            sql = sql + " ORDER BY " + gblOrderBy
        End If
        gblOrderBy = ""
        pb.Open sql$, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic
        If Not pb.EOF Then
            pb.MoveFirst
            pb.MoveLast
        End If
    Case BGETNEXT, BGETNEXT + S_NOWAIT_LOCK:            pb.MoveNext
    Case BGETPREVIOUS, BGETPREVIOUS + S_NOWAIT_LOCK:    pb.MovePrevious
    Case B_UNLOCK
        ''need to add code here
    Case BINSERT
        If pb.State = 0 Then
            pb.Open TableName, MISCO_SQL_DB, adOpenDynamic, adLockOptimistic
        End If
    Case BDELETE
        STATUS = 8
        pb.Delete
    Case Else
        STATUS = 1
        MsgBox "STOP: UNDEFINDED PROCEDURE" + Str$(icode)
End Select
If STATUS = 0 Then
    If pb.EOF Or pb.BOF Then STATUS = 9
End If

ProcessQuery1 = STATUS
Exit Function

ProcessSQLError:
    MsgBox TableName + ": " + Error(Err), vbCritical, "Error "
    ProcessQuery1 = 9

End Function

6 个答案:

答案 0 :(得分:1)

好吧,我不能说我知道发生了什么,但这里有一个可能的调试步骤:首先分配一个本地定义的整数,然后将AICROSSDOCKStatus分配给本地int。如果运行时错误13发生在第一次赋值时,会发生一些非常奇怪的事情 - 如果它发生在第二次,那么你可能想看看你的全局变量是否是你可能超出界限的数组。 / p> 祝你好运!

答案 1 :(得分:1)

尝试 msgbox ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "") 并查看该值是否为int?

我相信它不会是一个int&这是失败的结果。我的猜测是,它会产生使其成为非数字值的字符。

如果是数值,您可以在结果上尝试使用IsNumeric函数。

答案 2 :(得分:1)

尝试使用中间Variant,它应该从您的函数中获取任何类型的类型。它应该至少允许您调查返回值的实际类型。

答案 3 :(得分:1)

这将告诉您函数实际返回的类型的名称:

MsgBox TypeName(ProcessQuery(...)) 

在任何情况下将ProcessQuery()函数限制为int可能会有所帮助,从一开始就防止出现这样的错误:

Function ProcessQuery(whatever arguments) As Integer
  ''// ...
End Function

答案 4 :(得分:1)

API返回VB6 Integer(16位数量)有点不寻常。通常情况下,翻译C函数原型的人会将c“int”与VB6 Integer混淆,而VB6中的等效值实际上是很长的。

答案 5 :(得分:1)

问题不在于它在函数返回时遇到问题,而是通过引用传递的参数。我需要一个Recordset(pb)通过引用传递,但我已经声明(pb)作为记录。