vb执行下面代码提示 类型不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb执行下面代码提示 类型不匹配相关的知识,希望对你有一定的参考价值。

dim oshell
set oshell=createobject("wscript.shell")
oshell.run"calc",1 '启动计算器并让其处于激活状态
wait 2 '等待2秒
oshell.sendkeys"%h" '发送组合键alt+h

参考技术A wait 这个不是内部指令,缺少定义。

你可以使用 wscript.sleep 2000 来代替你的 wait 2

杠杠的。
参考技术B set oshell =CreateObject("wscript.shell")
oshell.run"calc",1 '启动计算器并让其处于激活状态
WScript.Sleep 2000
oshell.sendkeys"%h"
楼上的没错……,不知道谁给了个不给力本回答被提问者采纳

VB6:运行时错误“13”:设置和 int 时类型不匹配 int

【中文标题】VB6:运行时错误“13”:设置和 int 时类型不匹配 int【英文标题】:VB6: Runtime Error '13': Type Mismatch when setting and int with an int 【发布时间】: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 作为错误处理策略实际上可能会导致调试时间增加、更多挫败感、更高的胆固醇和脱发。在极少数情况下,由于刨削导致失明勺子等餐具的眼睛也可能发生)。 【参考方案1】:

好吧,我不能说我知道出了什么问题,但这里有一个可能的调试步骤:首先分配一个本地定义的整数,然后将 AICROSSDOCKStatus 分配给本地 int。如果运行时 err 13 发生在第一次分配时,那么确实会发生一些奇怪的事情 - 如果它发生在第二次,那么您可能想查看是否有任何全局变量是您可能超出界限的数组。

祝你好运!

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

MsgBox TypeName(ProcessQuery(...)) 

将 ProcessQuery() 函数限制为 int 在任何情况下都可能有助于从一开始就防止此类错误:

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

【讨论】:

当我在 ProcessQuery1 上的 ProcessQuery 中尝试这个时,我得到了预期的“整数”。当我尝试 TypeName(ProcessQuery(...)) 时出现错误。 那我猜错误发生在within ProcessQuery1()。取消注释“On Error Goto”语句以查看它的位置。顺便说一句,函数 ProcessQuery1() 是......相当混乱,委婉地说。类型不匹配根本不是它唯一的问题。 你不是在开玩笑说它有问题。它通过ProcessQuery1,当在ProcessQuery中达到'End Function'时出现错误。 由于 ProcessQuery() 和 ProcessQuery1() 似乎具有完全相同的签名...您可以直接在代码中调用 ProcessQuery1() 来获得乐趣吗? 所以错误确实实际上发生在 ProcessQuery1() 函数中。您是否注释掉了“On Error”声明?字符串连接是用 VB 中的“&”运算符完成的,而不是用“+”。也许就是这样(“sql =”select * from “+ etc. etc.”)。【参考方案4】:

API 返回一个 16 位的 VB6 整数有点不寻常。很多时候,翻译 C 函数原型的人会将 c“int”与 VB6 Integer 混淆,而在 VB6 中等价物实际上是 Long。

【讨论】:

【参考方案5】:

问题不在于函数的返回有问题,而是通过引用传递的参数有问题。我需要一个 Recordset(pb) 以通过引用传递,但我已将 (pb) 声明为 Record。

【讨论】:

【参考方案6】:

试试下面的,看看值是不是int,

msgbox ProcessQuery(iocode, pb, AICROSSDOCBOLFN, "")

我确信它不会是 int 并且这是它失败的结果。我的猜测是,它会带有字符,使其成为非数字值。

你可以尝试IsNumeric()函数对结果进行检查,是否为数值。

【讨论】:

以上是关于vb执行下面代码提示 类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

通过代码给数据库添加时提示无效的sql数据类型,是啥原因

VB.NET 数据类型不匹配,数据输入过长

vb的使用问题?

为啥下面我写的这段代码老是提示"不允许使用不完整类型"

VB里怎样让鼠标指针移动到按钮上时弹出提示对话框

VB6如何运行多行CMD命令?