我的问题是:通过sql语句把两表组合成一新表,我想问下如果不 成功怎么捕捉错误,比如 突然断电,网络延时,sql语句执行超时等呢
也可写无论遇到什么错误,只要不能合成新表成功,都捕捉错误大家帮帮忙啊 问题很急!~~
谢谢
也可写无论遇到什么错误,只要不能合成新表成功,都捕捉错误大家帮帮忙啊 问题很急!~~
谢谢
解决方案 »
- VS 2010对于C#改进了不少呢
- innosetup 怎么制作繁体安装版?
- 为什么取出的word表格单元格的内容都有一个“”!
- VB中怎樣檢測主機狀態
- 高手们帮忙看看,用MSChart的RowLabel 出现的问题!
- 请问一下asp是不是不支持VB里的PRINTER对象,为什么调用不了的?十万火急!!!!
- 本人是菜鸟,请大虾帮我完成下列语句的宏?
- 请问我利用sendmessage()发送的消息为什么系统收不到?(在线等候)
- 数据库问题,帮我解决,我送所有的分(要分多次送,目前我只能给100分)
- 哪位有VB5.0专业版(正版)出让?支持正版,由现在做起!!
- 关于PDf(PDF_In_The_Box.dll)
- 关于QQ自动发送消息源码修改高手帮帮忙吧
------------------
新建模块
引用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)
---------------------------
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
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 可是无法捕捉错误,不知道在什么情况下错误发生,高人请指教
问题很急,这个星期要解决!!(这个问题无法解决啊) 谢谢
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个记录写了几个记录后出错,前面的已写进去了,后面的没写进去,虽然程序报错中止,但写入了垃圾数据.所以,用事务处理就是为了确保数据的一致性和完整性,没有全部操作成功就撤消回滚数据.
我一共通过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
'开始窗体相应事件过程
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: 处理。
急急啊