使用sql server2000 。在vb里如何能获得视图触发器中raiserror 抛出的出错信息?  在vc中试验已经能够实现,问 在vb中如何得到?

解决方案 »

  1.   

    on error goto抓不到吗?
      

  2.   

    這是我們在VB裡使用和一段代碼,不知道是否合適你?strConflictSql = " IF NOT EXISTS (SELECT * FROM " & strTableName & Chr(10) & " WHERE " & strTemp & Chr(10) & "  RAISERROR ('Record has been changed by other users,you must requery again',16, 1) else "
    cmUpdateBatch.CommandText = " SET ANSI_NULLS OFF SET NOCOUNT ON  " & strVariant & Chr(10) & strSetOriginalValue & Chr(10) & strConflictSql & Chr(10) & " BEGIN " & strDeleteSql & " END " & Chr(10)
      

  3.   

    楼主的意思应该是:在一个表中创建一个触发器,包含有raiserror 语句,如果触发了这个触发器,那么如何在vb中实现捕捉raiserror 信息的方法.
      

  4.   

    --在SQL Server中创建测试环境use tempdb
    go--测试表
    create table tb(a int)
    go--测试视图
    create view v_a
    as
    select * from tb
    go--测试触发器
    create trigger tr_test on v_a
    instead of insert
    as
    if exists(select 1 from inserted where a>50)
    raiserror('输入的数字不能大于50,插入失败',16,1)
    go
      

  5.   

    '测试1
    '测试 ADODB.Connection 的 Execute 方法
    Sub test1()
        Dim conn$
        Dim db As ADODB.Connection
        
        '数据库连接字符串
        conn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb"
        
        '错误跳转的处理
        On Error GoTo lb_Err
        
        '测试 ADODB.Connection 的 Execute 方法
        Set db = New ADODB.Connection
        db.Open conn
        db.Execute ("insert v_a values(500)")
        db.Close
        Set db = Nothing
        
        '退出存储过程
        Exit Sub
        
    lb_Err:
        MsgBox "错误:" & Error()
        
        '如果对象没有关闭,则关闭对象
        If Not (db Is Nothing) Then
            If db.State <> 0 Then db.Close
            Set db = Nothing
        End If
    End Sub
      

  6.   

    '测试2
    '测试 ADODB.Recordset 对象的
    Sub test2()
        Dim conn$
        Dim re As ADODB.Recordset
        
        '数据库连接字符串
        conn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb"
        
        '错误跳转的处理
        On Error GoTo lb_Err
           
        '测试 ADODB.Recordset 对象的
        Set re = New ADODB.Recordset
        re.Open "v_a", conn, adOpenKeyset, adLockOptimistic
        re.AddNew
        re(0) = 500
        re.Close
        Set re = Nothing
        
        '退出存储过程
        Exit Sub
        
    lb_Err:
        MsgBox "错误:" & Error()
        
        '如果对象没有关闭,则关闭对象
        If Not (re Is Nothing) Then
            If re.State <> 0 Then
                If re.EditMode <> adEditNone Then re.CancelUpdate
                re.Close
            End If
            Set re = Nothing
        End If
        
    End Sub
      

  7.   

    '测试2少了update,改一下'测试2
    '测试 ADODB.Recordset 对象的
    Sub test2()
        Dim conn$
        Dim re As ADODB.Recordset
        
        '数据库连接字符串
        conn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=tempdb"
        
        '错误跳转的处理
        On Error GoTo lb_Err
           
        '测试 ADODB.Recordset 对象的
        Set re = New ADODB.Recordset
        re.Open "v_a", conn, adOpenKeyset, adLockOptimistic
        re.AddNew
        re(0) = 500
        re.Update
        re.Close
        Set re = Nothing
        
        '退出存储过程
        Exit Sub
        
    lb_Err:
        MsgBox "错误:" & Error()
        
        '如果对象没有关闭,则关闭对象
        If Not (re Is Nothing) Then
            If re.State <> 0 Then
                If re.EditMode <> adEditNone Then re.CancelUpdate
                re.Close
            End If
            Set re = Nothing
        End If
        
    End Sub
      

  8.   

    上面的两个测试,都能正常地弹出raiserror的错误信息
      

  9.   

    --接着加多一个基于表的触发器,并对应修改上面的测试代码为测试表的,结果一样能正确地弹出raiserror的错误--测试的触发器(基于表)
    create trigger tr_test_tb on tb
    for insert
    as
    if exists(select 1 from inserted where a<0)
    raiserror('输入的数字不能小于0,插入失败',16,1)
    go
      

  10.   

    在子程序或者函數的第一行寫上:
    sub/function(....)
    on error goto errHandle    '(你要進行處理錯誤的地方的標號)
    .............
    errHandle:
      error處理(如:msgbox err.description)
    end sub/function