我的问题是:通过sql语句把两表组合成一新表,我想问下如果不 成功怎么捕捉错误,比如 突然断电,网络延时,sql语句执行超时等呢 
也可写无论遇到什么错误,只要不能合成新表成功,都捕捉错误大家帮帮忙啊 问题很急!~~
谢谢

解决方案 »

  1.   


    ------------------
    新建模块
    引用microsoft activex data objects 2.0 library 以上
    ------------------
    Public Function ExecuteSQL(ByVal sql As String) As ADODB.Recordset
    Dim mycon As ADODB.Connection
    Dim rst As ADODB.Recordset
    Set mycon = New ADODB.Connection
    mycon.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=数据名称;User ID=sa;password=;Data Source=服务器地址或名称"
    mycon.ConnectionTimeout = 20
    On Error Resume Next
    mycon.Open
    If Err.Number = 0 Then
    Dim stokens() As String
    On Error GoTo exectuesql_error
    stokens = Split(sql)
    If InStr("INSER,DELETE,UPDATE", UCase(stokens(0))) Then
    mycon.Execute sql
    Else
    Set rst = New ADODB.Recordset
    rst.Open Trim(sql), mycon, adOpenKeyset, adLockOptimistic
    Set ExecuteSQL = rst
    End If
    exectuesql_exit:
    Set rst = Nothing
    Set mycon = Nothing
    Exit Function
    exectuesql_error:
    Resume exectuesql_exit
    Else
    MsgBox "连接失败:" & Err.Description, vbInformation, "提示"
    End If
    End Function---------------------------
    连接数据库时就使用
    dim txtsql as String
    Dim rs As ADODB.Recordset
    txtsql = "select  * from [tb]"
    Set rs = ExecuteSQL(txtsql)
    ---------------------------
      

  2.   

    下面是我在水电收费系统中使用ADO处理SQL事务的源码,但愿对你有所帮助
    Private Sub Command2_Click() '确定预存收费
    On Error GoTo ERRORINF'设置错误捕获
    Dim sql As String
    Dim Pre_Trans As Boolean
    If Trim(Text2.Text) = "" Then Exit Sub
    If CDbl(Trim(Text2.Text)) = 0 Then Exit Sub
    If Trim(Text2.Text) = "" Then
        MsgBox "注意:关键数据项存在空值,请检查!", vbInformation + vbOKOnly, "E_STUDIO"
        Exit Sub
    End If
    C_ID = CLng(Text1(2).Text)
    Y = CDbl(Text1(3).Text)
    Z = CDbl(Trim(Text2.Text))
    '计算用户当前余额
    X = Z + Y
    '打开数据库
    Set CON = New ADODB.Connection
    CON.ConnectionString = "DSN=" & FEE_DB & ";Uid=" & URD & ";pwd=" & PSD & ";"
    CON.ConnectionTimeout = 30
    CON.Open
    '-----------------------------------------开始收费事务----------------------------
    Pre_Trans = CON.BeginTrans
    '写入余额表remain
    Set RST = New ADODB.Recordset
    RST.Open " SELECT * FROM  Remain WHERE Cid=" & CLng(Text1(2).Text) & "", CON, adOpenStatic, adLockReadOnly, adCmdText
    If RST.RecordCount > 0 Then
        sql = "Update Remain set Remain=" & X & "where cid=" & CLng(Text1(2).Text)
        CON.Execute sql
    Else
        sql = "INSERT INTO Remain(Cid,Remain) VALUES(" & CLng(Text1(2).Text) & "," & X & ")"
        CON.Execute sql
    End If
    '写入预付费记录表
    sql = "INSERT INTO Prepay (Cid,Name,BR_Num,Prepay,L_Remain,Remain,PB_Num,Dt,Worker) VALUES(" & CLng(Text1(2).Text) & ",'" & _
        Text1(1).Text & "','" & Text1(0).Text & "'," & Z & "," & Y & "," & X & ",'" & Right(Label2.Caption, 8) & "','" & Date & "','" & Nme & "')"
    CON.Execute sql
    '更新单据流水号
    sql = "UPDATE ID SET PB_ID=PB_ID+1"
    CON.Execute sql
    '转换大写
    CIN_Pre = CIN_Num(CStr(Z)) & "(¥" & Format(Z, "0.00") & ")"
    '--------------------------------------------------提交收费事务----------------------------------CON.CommitTrans'提交事务
    sql = ""
    CON.Close
    Set CON = Nothing
    Set RST = Nothing
    '打印收据
    Call PRT_PB
    '刷新收费小计
    Form5.Total_Money = Form5.Total_Money + Z
    '清理控件
    For i = 0 To 3
        Text1(i).Text = ""
        Text1(i).BackColor = &HC0FFFF
    Next
    List1.Enabled = True
    Text2.Text = ""
    Text2.Locked = True
    Command2.Enabled = False
    Label2.Caption = ""
    X = 0
    Y = 0
    Z = 0
    Exit Sub
    '---------------------------------------------错误处理及回滚事务---------------------------------
    ERRORINF:
    If Pre_Trans = True Then'事务操作错误
            CON.RollbackTrans '回滚事务
             MsgBox "请注意:用户预存收费数据操作失败,请同管理员联系!" & vbCr + vbCr & Err.Description, vbInformation + vbOKOnly, "E_STUDIO"
    '在此加写入系统日志代码,设置日期字段值为NOW
     sql = "Insert Into Note (Typ,Note,Dt,Worker) Values ('水电费用预存,'预存事务操作失败','" & Now & "','" & Nme & "')"
        CON.Execute sql
    else
    '以下写入非事务操作错误处理代码
     If Err.Number <> 0 Then
                  MsgBox Err.Description, 48 + vbOKOnly, " E-STUDIO"
                   '以下可加入日志代码(未写)
                      …………
                    '开启控件操作
                    Toolbar1.Enabled = True
                    A.Enabled = True
                    B.Enabled = True
                    C.Enabled = True
                    E.Enabled = True
                    FF.Enabled = True
                    G.Enabled = True
              End If
    End If
    End Sub
      

  3.   

    大哥 ,小弟学习vb还不到两个月,新手,问题是这样的
    Private Sub ShipSailAccount_guozhang110() 
    DepartDate = Format(Now - 1, "yyyy-mm-dd) 
    cn.Execute "INSERT 作业状态表('" & DepartDate & "', 0)" 
    Call ShipSailAccount_guozhang1101 
    Call ShipSailAccount_guozhang1102 
    Call ShipSailAccount_guozhang1103 
    Call ShipSailAccount_guozhang1104 
    end sub上面是4个写表的方法我是按这下面写的,是当过帐成功时候(没出现错误异常的情况) ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','1') " 
    cn.Execute ssql, rdExecDirect 我想在过帐不成功的时候写进去
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','0') " 
    cn.Execute ssql, rdExecDirect 其实我就是以1为成功,0为不成功了。
    我这样写:我这样写 ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','1') " 
    cn.Execute ssql, rdExecDirect 
    On Error GoTo ERRDel '//错误捕捉 
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','0') " 
    cn.Execute ssql, rdExecDirect 'Exit Sub '//错误处理 
    ERRDel: 
    MsgBox "过帐不成功" 
    Form3.Show 1 可是无法捕捉错误,不知道在什么情况下错误发生,高人请指教 
    问题很急,这个星期要解决!!(这个问题无法解决啊) 谢谢
      

  4.   

    俺的代码中已经给你写和很清楚了,不愿意认真分析代码没办法.如果你不愿意用事务(建议用)也成,监视错误很简单,将On Error GoTo ERRDel这句放到你过程的第一句,请注意:On Error GoTo ERRDel只对该语句以下语句或执行错误进行捕获!!!比如你这个写表过程是个command_click()过程,那么就将On Error GoTo ERRDel放在这个过程的开头第一句,ERRDel:一般放在最后,根据需要定.按你目前的代码顺序,只能捕获以下语句的错误,但写表过程不在你的捕获范围之内.
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','0') " 
    cn.Execute ssql, rdExecDirect 
    'Exit Sub '//错误处理 *********************EXIT前的单引号要去掉,否则会捕获0号错误.因为程序正常执行时也是返回错误代码0,非0才是需要捕获的.如果不去单引号需要在MSGBOX前加个If Err.Number <> 0 Then 才行.
    ERRDel: 
    MsgBox "过帐不成功" 
    Form3.Show 1 
    另外,如果不用事务处理机制,如果你有10个记录写了几个记录后出错,前面的已写进去了,后面的没写进去,虽然程序报错中止,但写入了垃圾数据.所以,用事务处理就是为了确保数据的一致性和完整性,没有全部操作成功就撤消回滚数据.
      

  5.   

    我的情况是这样的,我在窗体相应事件调用这个 ShipSailAccount_guozhang110 起到自动过账
    我一共通过4个方法,我向实现的过程是这样的:若四个方法都没有错误,执行写入
    ''日志表
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','1') ",
    执行过程中方法一成功,接下方法2,以此类推,如果出现错误,就执行
    ''日志表
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','0') ",并跳出,ShipSailAccount_guozhang110,作出提醒(),其中我不知道怎么执行错误捕捉,那个错误捕捉时不是要在四个方法内写呢?我是想只要发生错误,无论什么错误,就就行错误处理,我是想这样写:
    在每个方法前面加入
    On Error GoTo ERRDel '//错误捕捉最后写入:
    'ERRDel:
    ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','0') "
    cn.Execute ssql, rdExecDirect
    MsgBox "过帐不成功"
    Form3.Show 1
    那么Exit Sub 放哪里啊
    还有就是如果先执行的方法成功,接下遇到错误,那马上要进行错误处理,并跳出 ShipSailAccount_guozhang110 在四个方法中怎么进行错误捕捉!????小弟新手,说详细点,谢谢,下午就要解决的问题,是不应该用个boolen 型控制是否错误啊?Private Sub ShipSailAccount_guozhang110() 
    DepartDate = Format(Now - 1, "yyyy-mm-dd) 
    cn.Execute "INSERT 作业状态表('" & DepartDate & "', 0)" 
    Call ShipSailAccount_guozhang1101 
    Call ShipSailAccount_guozhang1102 
    Call ShipSailAccount_guozhang1103 
    Call ShipSailAccount_guozhang1104 
    end sub 上面是4个写表的方法 我是按这下面写的,是当过帐成功时候(没出现错误异常的情况)每个方法都正确的情况 ssql = "insert into 过帐状态表(过帐时间,开船时间,状态) values ('" & DtToday & "','" & DepartDate & "','1') " 
    cn.Execute ssql, rdExecDirect 
    End sub
      

  6.   

    建议取消Private Sub ShipSailAccount_guozhang110() 子过程,将其中代码写入窗体相应事件中,结构:
    '开始窗体相应事件过程
    Private Sub form****
    on error goto ERRDel'设置错误捕获,放在第一行
    ……'其它需要的代码
    '调用子过程
    DepartDate = Format(Now - 1, "yyyy-mm-dd) 
    cn.Execute "INSERT 作业状态表('" & DepartDate & "', 0)" 
    Call ShipSailAccount_guozhang1101 
    Call ShipSailAccount_guozhang1102 
    Call ShipSailAccount_guozhang1103 
    Call ShipSailAccount_guozhang1104 
    ……'其它需要的代码,并将正常情况记录日志
    '进行错误处理
    ERRDel: 
    ……'错误处理代码,并将错误情况写入日志
    End sub'结束窗体事件
    不在要ShipSailAccount_guozhang1101 等被调用的子过程中设置错误捕获,全交由主过程ERRDel: 处理。
      

  7.   

    你的 意思 是不要在 4个方法内设置错误捕捉吗?可是如果方法中有的成功,有的错误呢?那成功的进行错误处理吗?那么假如前两个方法执行正确,第三个方法错误,那怎么退出啊?这样的情况怎么处理哈Exit Sub 放哪啊?如果不要这个不是错误情况也写进去了吗?
    急急啊