【发布时间】:2009-05-08 16:00:50
【问题描述】:
我对 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
【问题讨论】:
-
你能发布ProcessQuery的定义吗?
-
您能否发布 ProcessQuery 的完整代码而不仅仅是签名?
-
哇。有些人编码好像维护程序员是一个知道自己住在哪里的暴力精神病患者。其他人编写的代码会将任何维护者变成暴力精神病患者。 ProcessQuery1是二流派的产物。
-
介绍 Msgbox:以简单的方式处理错误!毕竟,Err.Raise 和错误处理程序只是......太复杂了。你现在需要你的错误并且需要它们在你的脸上!! BAM!
vbCritical你今天采用了这个新的错误处理“最佳实践”!! (注意:实际结果可能会有所不同。使用 MsgBox 作为错误处理策略实际上可能会导致调试时间增加、更多挫败感、更高的胆固醇和脱发。在极少数情况下,由于刨削导致失明勺子等餐具的眼睛也可能发生)。