我不是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
答案 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)作为记录。