ON ERROR GOTO ERRMSGERRMSG:
IF ERR.NUMBER=操作1 THENELSEIF ERR.NUMBER=操作2 THENENDIF

解决方案 »

  1.   

    我的解决办法是在SQl中用存储过程添加记录或作其他操作。在存储过程中设置错误发送语句。还可自定义错误。在VB中用Error 对象即可捕获。
      

  2.   

    感谢您使用微软产品。您可以在ADODB.Connection 的ExecuteComplete事件发生时判断SQL语句是否执行成功的信息,并获取错误信息。如果此时不对错误进行处理,将发生Rum-time Error,您可以使用On Error Statement来处理错误,防止程序的崩溃。如果SQL语句的执行没有错误,ADO.connection对象的execute方法的第二个参数是存储返回值的变量,反映了受影响的记录个数,您可以通过这个参数变量获得SQL语句执行结果的信息。如下例:Private WithEvents cases As ADODB.Connection   ‘为了获取对象的事件,需在声明对象时加WithEvents关键字。Private Sub cases_ExecuteComplete(ByVal RecordsAffected As Long, _
    ByVal pError As ADODB.Error, _
    adStatus As ADODB.EventStatusEnum, _
     ByVal pCommand As ADODB.Command, _
    ByVal pRecordset As ADODB.Recordset, _
     ByVal pConnection As ADODB.Connection)
    If adStatus = adStatusErrorsOccurred Then
           MsgBox pError.Description
    Else
         MsgBox "exec success"
    End If
    End SubPrivate Sub Command2_Click()
        Set cases = CreateObject("ADODB.Connection")
        cases.Open ("testdb1")    
        Dim num As Integer    
        exsql = "delete from Table1 where ID>0"    
        On Error GoTo errl    
        cases.Execute exsql, num    
        Text2.Text = num    
        Exit Sub
        
    errl:    
        MsgBox Err.Description    
        Exit SubEnd Sub每次执行与ADO有关的操作时,所有provider errors都被加入connection的Errors属性,您也可以由此获得错误信息。修改on error的处理代码如下:
    errl:    
        For Each Err In cases.Errors
          
          strError = "Error #" & Err.Number & vbCr & _
             "   " & Err.Description & vbCr & _
             "   (Source: " & Err.Source & ")" & vbCr & _
             "   (SQL State: " & Err.SQLState & ")" & vbCr & _
             "   (NativeError: " & Err.NativeError & ")" & vbCr
          If Err.HelpFile = "" Then
             strError = strError & "   No Help file available"
          Else
             strError = strError & _
                "   (HelpFile: " & Err.HelpFile & ")" & vbCr & _
                "   (HelpContext: " & Err.HelpContext & ")" & _
                vbCr & vbCr
          End If
             
          Debug.Print strError
       Next
       Exit Sub详细信息请参考:
    Execute Method (ADO Connection)
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcnnexecute.asp
    ExecuteComplete Event
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdevtexecutecomplete.asp
    On Error Statement
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/vastmonerror.asp
    Errors Collection
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdcolerrors.asp
    Description, HelpContext, HelpFile, NativeError, Number, Source, and SQLState Properties Example (VB)
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdprodescriptionx.asp
    -  微软全球技术中心 VB技术支持
    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
      

  3.   

    on error goto err1    exit sub
    err1:
        msgbox err.number & err.description
    '    IF ERR.NUMBER=操作1 THEN
    '    ELSEIF ERR.NUMBER=操作2 THEN
    '    ENDIF
        exit sub 
    记下错误代码和错误信息
    再把备注部分用相应的恢复
      

  4.   

    Transact-SQL 参考  
    RAISERROR
    返回用户定义的错误信息并设系统标志,记录发生错误。通过使用 RAISERROR 语句,客户端可以从 sysmessages 表中检索条目,或者使用用户指定的严重度和状态信息动态地生成一条消息。这条消息在定义后就作为服务器错误信息返回给客户端。语法
    RAISERROR ( { msg_id | msg_str } { , severity , state }
        [ , argument [ ,...n ] ] )
        [ WITH option [ ,...n ] ]参数
    msg_id存储于 sysmessages 表中的用户定义的错误信息。用户定义错误信息的错误号应大于 50,000。由特殊消息产生的错误是第 50,000 号。msg_str是一条特殊消息,其格式与 C 语言中使用的 PRINTF 格式样式相似。此错误信息最多可包含 400 个字符。如果该信息包含的字符超过 400 个,则只能显示前 397 个并将添加一个省略号以表示该信息已被截断。所有特定消息的标准消息 ID 是 14,000。msg_str 支持下面的格式:% [[flag] [width] [precision] [{h | l}]] type可在 msg_str 中使用的参数包括:flag用于确定用户定义的错误信息的间距和对齐的代码。代码 前缀或对齐 描述 
    -(减) 左对齐 在给定字段宽度内左对齐结果。 
    +(加) +(加)或 -(减)前缀 如果输出值为带符号类型,则在输出值的前面加上加号(+)或减号(-)。 
    0(零) 零填充 如果宽度的前面有 0,则添加零直到满足最小宽度。若出现 0 和 -,将忽略 0。若使用整型格式(i, u, x, X, o, d)指定 0,则忽略 0。 
    #(数字) 对 x 或 X 的十六进制类型使用 0x 前缀 当使用 o、x 或 X 格式时,# 标志在任何非零值的前面分别加上 0、0x 或 0X。当 d、i 或 u 的前面有 # 标记时,将忽略该标记。 
    ' '(空格) 空格填充 如果输出值带符号且为正,则在该值前加空格。如果包含在加号(+)标记中,则忽略该标记。 
    width定义最小宽度的整数。星号 (*) 允许 precision 确定宽度。precision是输出字段最多输出的字符数,或为整数值输出的最小小数位数。星号 (*) 允许 argument 确定精度。{h | l} type与字符类型 d、i、o、x、X 或 u 一起使用,用于创建 short int (h) 或 long int (l) 类型的值。字符类型 表示 
    d 或 I 带符号的整数 
    o 不带符号的八进制数 
    p 指针型 
    s String 
    u 不带符号的整数 
    x 或 X 不带符号的十六进制数 
    说明  不支持 float、双精度和单精度字符类型。
    severity用户定义的与消息关联的严重级别。用户可以使用从 0 到 18 之间的严重级别。19 到 25 之间的严重级别只能由 sysadmin 固定服务器角色成员使用。若要使用 19 到 25 之间的严重级别,必须选择 WITH LOG 选项。注意  20 到 25 之间的严重级别被认为是致命的。如果遇到致命的严重级别,客户端连接将在收到消息后终止,并将错误记入错误日志和应用程序日志。
    state从 1 到 127 的任意整数,表示有关错误调用状态的信息。state 的负值默认为 1。argument是用于取代在 msg_str 中定义的变量或取代对应于 msg_id 的消息的参数。可以有 0 或更多的替代参数;然而,替代参数的总数不能超过 20 个。每个替代参数可以是局部变量或这些任意数据类型:int1、int2、int4、char、varchar、binary 或 varbinary。不支持其它数据类型。option错误的自定义选项。option 可以是以下值之一:值 描述 
    LOG 将错误记入服务器错误日志和应用程序日志。记入服务器错误日志的错误目前被限定为最多 440 字节。 
    NOWAIT 将消息立即发送给客户端。 
    SETERROR 将 @@ERROR 的值设置为 msg_id 或 50000,与严重级别无关。 
    注释
    如果使用 sysmessages 错误并且是使用前面显示的 msg_str 格式创建的消息,则将给所提供的 msg_id 的消息传递提供的参数(argument1、argument2 等等)。当使用 RAISERROR 创建和返回用户定义的错误信息时,使用 sp_addmessage 添加用户定义的错误信息,使用 sp_dropmessage 删除用户定义的错误信息。当出现错误时,错误号将放在 @@ERROR 函数中,该函数存储最新生成的错误号。对于严重级别为 1 到 10 的消息,@@ERROR 的默认设置为0。示例
    A. 创建特定消息
    下例显示可能出现的两种错误。第一种错误很简单,生成的是静态消息。第二种错误则是在尝试修改的基础上动态生成的。CREATE TRIGGER employee_insupd
    ON employee
    FOR INSERT, UPDATE
    AS
    /* Get the range of level for this job type from the jobs table. */
    DECLARE @@MIN_LVL tinyint,
       @@MAX_LVL tinyint,
       @@EMP_LVL tinyint,
       @@JOB_ID smallint
    SELECT @@MIN_LVl = min_lvl, 
       @@MAX_LV = max_lvl, 
       @@ EMP_LVL = i.job_lvl,
       @@JOB_ID = i.job_id
    FROM employee e, jobs j, inserted i 
    WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
    IF (@@JOB_ID = 1) and (@@EMP_lVl <> 10) 
    BEGIN
       RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
       ROLLBACK TRANSACTION
    END
    ELSE
    IF NOT @@ EMP_LVL BETWEEN @@MIN_LVL AND @@MAX_LVL)
    BEGIN
       RAISERROR ('The level for job_id:%d should be between %d and %d.',
          16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
       ROLLBACK TRANSACTION
    ENDB. 在 sysmessages 中创建特殊消息
    下例显示如何通过执行 employee_insupd 触发器获得与 RAISERROR 相同的效果,而 RAISERROR 使用给存储在 sysmessages 表中的消息传递参数的方法。该消息通过 sp_addmessage 系统存储过程,以消息号 50005 被添加到 sysmessages 表中。说明  下例仅供举例说明。
    RAISERROR (50005, 16, 1, @@JOB_ID, @@MIN_LVL, @@MAX_LVL)
    请参见DECLARE @local_variable 函数PRINTsp_addmessagesp_dropmessagesysmessagesxp_logevent&copy;1988-2000 Microsoft Corporation。保留所有权利。
      

  5.   

    疑难解答  
    错误 8000 -8999
    错误 严重度 描述(消息文本) 
    8101 16 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 ''%1!'' 中为标识列指定显式值。 
    8102 16 无法更新标识列 ''%1!''。 
    8103 16 表 ''%1!'' 不存在,或无法为 SET 操作打开该表。 
    8104 16 当前用户不是表 ''%1!'' 的数据库或对象所有者。无法执行 SET 操作。 
    8105 16 ''%1!'' 不是用户表。无法执行 SET 操作。 
    8106 16 表 ''%1!'' 没有标识属性。无法执行 SET 操作。 
    8107 16 表 ''%1!.%3!.%5!'' 的 IDENTITY_INSERT 已经为 ON。无法对表 ''%7!'' 执行 SET 操作。 
    8108 16 无法使用 SELECT INTO 语句向表 ''%1!'' 中添加标识列,该表中已有继承了标识属性的列 ''%3!''。 
    8109 16 试图使用 SELECT INTO 语句向表 ''%1!'' 中添加多个标识列。 
    8110 16 无法向表 ''%1!'' 中添加多个 PRIMARY KEY 约束。 
    8111 16 无法在表 ''%1!'' 中可为空的列上定义 PRIMARY KEY 约束。 
    8112 16 无法为表 ''%1!'' 上的约束添加多个聚集索引。 
    8114 16 将数据类型 %1! 转换为 %2! 时出错。 
    8115 16 将 %1! 转换为数据类型 %2! 时发生算术溢出错误。 
    8116 16 函数 %3! 的参数 %2! 的数据类型 %1! 无效。 
    8117 16 操作数数据类型 %1! 无效(运算符 %2!)。 
    8118 16 列 ''%1!.%3!'' 在选择列表中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。 
    8119 16 列 ''%1!.%3!'' 在 HAVING 子句中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。 
    8120 16 列 ''%1!.%3!'' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 
    8121 16 列 ''%1!.%3!'' 在 HAVING 子句中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 
    8122 16 只有 UNION 语句中的第一个查询才能使用带赋值的 SELECT。 
    8123 16 相关表达式无效,因为该表达式不在 GROUP BY 子句中。 
    8124 16 在包含外部引用的被聚合表达式中指定了多个列。如果被聚合的表达式包含外部引用,那么该外部引用就必须是该表达式中所引用的唯一的一列。 
    8125 16 在 FROM 子句包含被聚合列所在的表的查询中,包含外部引用的被聚合表达式必须包含在选择列表或 HAVING 子句子查询中。 
    8126 16 列名 ''%1!.%3!'' 在 ORDER BY 子句中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句。 
    8127 16 列名 ''%1!.%3!'' 在 ORDER BY 子句中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 
    8128 10 使用 ''%1!'' 版本 ''%2!'' 来执行扩展存储过程 ''%3!''。 
    8129 16 新的磁盘大小必须大于 %1!。请考虑使用 DBCC SHRINKDB。 
    8130 16 该设备不是数据库设备。只有数据库设备才能扩充。 
    8131 10 扩展存储过程 DLL ''%1!'' 不输出 __GetXpVersion() 函数。详细信息请参见文档中的主题 ''向后兼容性详细信息(级别 1)- 开放式数据服务''。 
    8132 10 扩展存储过程 DLL ''%1!'' 报告其版本为 %2!.%3!。服务器预期的版本为 %4!.%5!。 
    8133 16 CASE 说明中的任一结果表达式均不能是 NULL。 
    8134 16 遇到被零除错误。 
    8135 16 表级别的约束未指定列的列表,表 ''%1!''。 
    8136 16 在 %1! 约束键列表中指定了重复的列,表 ''%2!''。 
    8138 16 在外键列的列表中指定的列多于 16 个,表 ''%1!''。 
    8139 16 外键中引用列的数目与被引用列的数目不等,表 ''%1!''。 
    8140 16 在列级别 %1! 约束中指定了不止一个键,表 ''%2!''。 
    8141 16 列 %1! 约束(属于列 ''%2!'')引用了另一列,表 ''%4!''。 
    8142 16 在 %1! 约束中不支持子查询,表 ''%2!''。 
    8143 16 多次提供了参数 ''%1!''。 
    8144 16 为过程或函数 %1! 指定的参数太多。 
    8145 16 %1! 不是过程 %3! 的参数。 
    8146 16 过程 %1! 没有参数,但却为该过程提供了参数。 
    8147 16 未能在可为空的列 ''%1!'' 上创建 IDENTITY 特性,表 ''%3!''。 
    8148 16 指定了不止一个列 %1! 约束(对列 ''%2!''),表 ''%4!''。 
    8149 16 在纤程模式下不支持 OLE 自动化对象。 
    8150 16 为列 ''%1!'' 指定了多个 NULL 约束,表 ''%3!''。 
    8151 16 为列 ''%1!'' 同时定义了 PRIMARY KEY 和 UNIQUE 约束,表 ''%3!''。只允许定义二者之一。 
    8152 16 将截断字符串或二进制数据。 
    8153 0 警告:聚合或其它 SET 操作消除了空值。 
    8154 15 表 ''%1!'' 不明确。 
    8155  15 没有为第 %1! 列(属于 ''%2!'')指定列。 
    8156 15 多次为 ''%3!'' 指定了列 ''%1!''。 
    8157 15 包含 UNION 运算符的查询表达式中的所有查询都必须在选择列表中包含同样数目的表达式。 
    8158 15 ''%1!'' 所拥有的列多于列的列表中所指定的列。 
    8159 15 ''%1!'' 所拥有的列少于列的列表中所指定的列。 
    8160 15 仅当 GROUP BY 子句中指定了 CUBE 或 ROLLUP 时,才能指定分组函数。 
    8161 15 分组函数的参数与 GROUP BY 子句中的所有表达式都不匹配。 
    8162 16 形式参数 ''%1!'' 定义为 OUTPUT,但实际参数却未声明为 OUTPUT。 
    8163 16 不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型。 
    8164 16 INSERT EXEC 语句不能嵌套。 
    8165 16 子命令值 %1! 无效。有效范围为从 %2! 到 %3!。 
    8166 16 不允许使用约束名称 ''%1!''。约束名称不能以数字号 (#) 开头。 
    8168 16 无法创建两个名为 ''%1!'' 的约束。约束名称不允许重复。 
    8169 16 将字符串转换为 uniqueidentifier 时出现语法错误。 
    8170 16 将 uniqueidentifier 值转换为 char 时结果空间不足。 
    8171 16 对象 ''%2!'' 上的提示 ''%1!'' 无效。 
    8175 10 未能找到表 %1!。将稍后再尝试解析此表名。 
    8176 16 Resync 过程需要键值 ''%1!'',但未提供该键值。 
    8177 16 无法在 %1! 子句中使用列,除非该列包含在聚合函数或 GROUP BY 子句中。 
    8178 16 被准备语句 ''%1!'' 需要参数 %3!,但未提供该参数。 
    8179 16 未能找到句柄为 %1! 的被准备语句。 
    8180 16 未能准备语句。 
    8181 16 syscomments 中缺少 ''%1!'' 的文本。必须除去并重建该对象后,才能使用该对象。 
    8183 16 在计算列上只允许使用 UNIQUE 或 PRIMARY KEY 约束。 
    8184 16 展开 ''*'' 时出错:并非所有列均可比,''*'' 展开了零列。 
    8185 16 展开 ''*'' 时出错:在基础表或视图中发现不可比的列。 
    8186 16 ''%1!'' 函数只能用于用户和系统表。 
    8190 16 如果不定义要筛选的表,将无法编译复制筛选过程。 
    8191 16 复制筛选过程只能包含 SELECT、GOTO、IF、WHILE、RETURN 和 DECLARE 语句。 
    8192 16 复制筛选过程不能有参数。 
    8193 16 无法执行标记为 FOR REPLICATION 的过程。 
    8194 16 当应用程序角色处于活动状态时,无法执行 USE 语句。 
    8196 16 将重复的列指定成了 ROWGUIDCOL。 
    8197 16 Windows NT 用户 ''%1!'' 没有对服务器的访问权。 
    8198 16 未能获得有关 Windows NT 组/用户 ''%1!'' 的信息。 
    8199 16 在 EXECUTE <procname> 中,procname 只能是类型为 char、varchar、nchar 或 nvarchar 的字面值或变量。 
    8501 16 服务器 ''%1!'' 上的 MSDTC 不可用。 
    8502 20 收到了未知的 MSDTC 令牌 ''0x%1!''。 
    8504 20 事务导入缓冲区无效。 
    8506 20 从 %1! 到 %2! 的事务状态转换请求无效。 
    8508 20 ''%1!'' 的QueryInterface 失败:%2!。 
    8509 20 MSDTC 事务的导入失败:%1!。 
    8510 20 MSDTC 事务的登记失败:%1!。 
    8511 20 MSDTC 请求的隔离级别 %1! 未知。 
    8512 20 MSDTC 提交确认失败:%1!。 
    8513 20 MSDTC 终止确认失败:%1!。 
    8514 20 MSDTC PREPARE 确认失败:%1!。 
    8515 20 MSDTC 全局状态无效。 
    8517 20 获取 MSDTC PREPARE 信息失败:%1!。 
    8518 20 MSDTC BEGIN TRANSACTION 失败:%1!。 
    8519 16 当前 MSDTC 事务必须由远程客户端提交。 
    8520 20 内部 MSDTC 事务的提交失败:%1!。 
    8521 20 唤醒状态无效。休眠于 %1!;而唤醒于 %2!。 
    8522 20 MSDTC 终止了分布式事务。 
    8523 15 不允许对 MSDTC 事务使用 PREPARE TRAN 语句。 
    8524 16 当前事务未能导出到远程提供程序。已回滚了该事务。 
    8525 16 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。 
    8601 17 内部查询处理器错误:查询处理器未能获得对所需接口的访问权。 
    8602 16 在索引优化向导中必须显式地包括提示中所使用的索引。 
    8616 10 忽略了表 ''%1!'' 的索引提示,因为将该表看作了星型联接中的事实数据表。 
    8617 17 查询无效:CUBE 和 ROLLUP 无法计算区分聚合。 
    8618 17 警告:查询处理器未能用优化程序生成查询计划,因为 GROUP BY 或 ORDER BY 子句中所有列的总长度超过了 8000 字节。 
    8619 17 警告:查询处理器未能用优化程序生成查询计划,因为 GROUP BY 或 ORDER BY 子句中所有列的总长度超过了 8000 字节。请重新提交查询,并且不要在查询中使用 ROBUST PLAN 提示。 
    8620 17 内部查询处理器错误:查询处理器遇到了内部限制溢出错误。 
    8621 16 内部查询处理器错误:在查询优化过程中,查询处理器用尽了堆栈空间。 
    8622 16 由于此查询中定义的提示,查询处理器未能生成查询计划。请重新提交查询,并且不要在查询中指定任何提示,也不要使用 SET FORCEPLAN。 
    8623 16 内部查询处理器错误:查询处理器未能生成查询计划。如需了解详细信息,请与您的主要支持提供者联系。 
    8624 16 内部 SQL Server 错误。 
    8625 16 警告:由于使用了局部联接提示,所以联接次序得以强制实施。 
    8626 16 在工作表中只允许有 text 指针,而决不允许有 text、ntext 或 image 列。查询处理器生成的查询计划要求在工作表中有 text、ntext 或 image 列。 &copy;1988-2000 Microsoft Corporation。保留所有权利。