BEGIN TRY
BEGIN TRAN
-- 在A表中插入数据
INSERT INTO [dbo].[A] ( [A_Name] , [A_Remark] ) VALUES ( ‘xxx' , 'yyy' )
-- 在B表中插入数据
INSERT INTO [dbo].[B] ( [A_ID] , [B_Name] , [B_Remark] ) VALUES ( @@IDENTITY, 'xxxxxx' , 'zzzzzzzzzzzz' )
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO [dbo].[ErrorLog] ( [EL_Procedure] , [EL_OperateTime] ) -- 报异常时间
VALUES ( 'TEST_PROC' , CONVERT(DATETIME,GETDATE(),20) )
END CATCH
这是一次性 发送的SQL语句, 插入 两个表的记录,
当中有失败的 就会跳到 Begin catch 里面,然后 执行 Rollback Tran 不做任何的改动,
没有错误的话,会知道 最后 Commit Tran 写入两表的数据,
第二个表 的 @@IDENTITY 是SQL的变量,是最后一个插入的 自动编号。
最后那个 insert 是记录出错情况的,要不要这个表和这个记录就随便你!
你这种情况可能的原因不只一种,你可以先尝试将代码改成下面的ADO事务方式,如果仍然存在问题,就说明是服务器上的某个表有损坏,造成的异常,这样就需要先把数据导出到一个Access数据库文件,然后在服务器上重新建表,再把数据导回去。
Private Sub btnSave_Click()
On Error GoTo ErrorHandler
Dim strSQL As String
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim rstTmp As DAO.Recordset
Dim blnTransBegin As Boolean
'打开连接
Set cnn = New ADODB.Connection
cnn.Open "Provider=SQLOLEDB;Data Source=192.168.1.1;Database=我的数据库", "用户名", "密码"
'启动事务
cnn.BeginTrans
blnTransBegin = True
'打开到后台数据库指定的表的记录集
Set rst = New ADODB.Recordset
strSQL = "SELECT * FROM tbl_Wip_Wo_Dep_Stock"
rst.Open strSQL, cnn, adLockOptimistic, adLockOptimistic
'打开临时表记录集
Set rstTmp = CurrentDb.OpenRecordset("Temp_tbl_Wip_Wo_Dep_Detail", , dbReadOnly)
'循环临时表记录集中的每条记录,添加到后台数据库的表中
Do Until rstTmp.EOF
rst.AddNew
rst!WoCode = rstTmp!WoCode
rst!Dep = Me![ToDep]
rst!DepDate = Me![TrDate]
rst.Update
rstTmp.MoveNext
Loop
rst.Close '关闭记录集
rstTmp.Close '关闭临时表
cnn.CommitTrans '提交事务
MsgBoxEx "保存成功!", vbInformation
ExitHere:
Set rst = Nothing
Set rstTmp = Nothing
Set cnn = Nothing
Exit Sub
ErrorHandler:
'出错时如果已启动事务,则回滚撤销
If blnTransBegin Then
cnn.RollbackTrans
blnTransBegin = False
End If
MsgBox Err.Description, vbCritical
Resume ExitHere
End Sub
总记录:4篇 页次:1/1 9 1 :