maidinhdan > 09-03-20, 04:37 PM
HamThemADOBeginTran hoặc HamThemADOBeginTran True 
HamThemADOBeginTran False 
'---------------------------------------------------------------------------------------
' Procedure : HamThemADOBeginTran
' Author    : maidinhdan
' Date      : 09/03/2020
' Purpose  :
'---------------------------------------------------------------------------------------
Function HamThemADOBeginTran(Optional DataHienHanh as Boolean=True)
    On Error GoTo Loi
    Dim Cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
If DataHienHanh=True then
Set Cnn = CurrentProject.Connection ' Mở kết nối đến database hiện hành 
else 
'Kết nối với file Access khác hoặc SQl Server....thì dùng code sau: Ở Demo này sẽ dùng File không pass như bên dưới để các bạn dễ theo dõi
' Còn các ChuoiKetNoi còn lại để đây cho các bạn tham khảo thêm
Set Cnn = New ADODB.Connection
Dim ChuoiKetNoi As String
Dim LinkFileData As String
    LinkFileData = CurrentProject.Path & "\DataTest.mdb"
'    'ChuoiKetNoi dung cho Access co pass
'        ChuoiKetNoi = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & LinkFileData & ";Jet OLEDB:Database Password=111444;"
'    'ChuoiKetNoi dung cho Access 2003 tro xuong khong co pass
        ChuoiKetNoi = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & LinkFileData & ";Persist Security Info=False"
'    'ChuoiKetNoi dung cho Access 2007 tro len khong co pass
'        ChuoiKetNoi = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & LinkFileData & ";Persist Security Info=False"
'    'ChuoiKetNoi dung cho SQL Server
'        ChuoiKetNoi = "Provider = SQLOLEDB;Data Source=222.254.241.8,1433;Initial Catalog=Vanbandientu;User ID=AdminMaidinhdan;Password=soctrang;"
'            '222.254.241.8= Địa chỉ IP máy chủ
'            '1433=Cổng kết nối Server
'            'Vanbandientu=Tên Database trên Server
'            'AdminMaidinhdan=Tai khoan dang nhap vao may chu
'            'soctrang=Mật khẩu đăng nhập Sql Server
Cnn.ConnectionString = ChuoiKetNoi
Cnn.CursorLocation = adUseClient ' Con trỏ phía Client, Nếu không khai báo sẽ báo lỗi khì dùng lệnh [Set .ActiveConnection = Nothing]
Cnn.Open ' Mở kết nối đến database theo LinkFileData
    end if
    Set rst = New ADODB.Recordset 'Tạo Recordset mới
    With rst
    Set .ActiveConnection = Cnn 'Gán Recordset kết nối đến Connection cnn
                .LockType = adLockOptimistic ' Kiểu khoá áp đặt lên record hiện hành: Tham khảo thêm tài liệu nhé
                .CursorType = adOpenKeyset ' Cho biết kiểu của con trỏ Recordset được dùng : Tham khảo thêm tài liệu nhé
                .Source = "Select * from tblTest" ' tên table cần kết nối
                .Open ' mở kết nối đến bảng
    End With
Cnn.BeginTrans 'Bắt đầu một transaction mới ( Cứ hiểu transaction nó là một giao dịch) => Bắt đầu giao dịch
'Bặt đầu vòng lặp từ đầu đến cuối cùng
    ' Duyet de them moi vao table tblTest 5000 mau tin cot [b]<=> rs.Fields(1) ; Cot [A] la AutoNumber
Dim i As Integer    'Tao bien dem
    For i = 1 To 5000
        rst.AddNew  'Ra lenh them
        rst.Fields(1) = "Test du lieu dong thu: " & i    'Them vao cot [b]tuc la cot thu 2 voi noi dung tu 1 den 5000 cu the lap lai
rst.Update
    Next i
    ' Xác nhận lưu không? ==> xác nhận chập nhận giao dịch hay không?
    If MsgBox("Bạn có muốn Lưu các thay cập nhật trên không?", vbYesNo) = vbYes Then
        Cnn.CommitTrans    'Đồng ý giao dịch: Lưu các thay đổi và kết thúc transaction hiện hành
    Else
        Cnn.RollbackTrans  'Hủy giao dịch: Huỷ bỏ các thay đổi của transaction và kết thúc nó
    End If
'Phần bắt lỗi trong quá trình làm việc
ThoatLoi:
    ' đóng rst, cnn và giải phóng bộ nhớ
    rst.Close
    Set rst = Nothing
If DataHienHanh = False Then Cnn.Close
    Set Cnn = Nothing
        Exit Function
        
Loi:
        'Nếu lỗi phát sinh trong quá trình cập nhật sẽ chạy các đoạn lệnh dưới đây
        Cnn.RollbackTrans ' Hủy giao dịch
        Resume ThoatLoi
End Function 
Function HamSuaADOBeginTran(Optional DataHienHanh as Boolean=True)
    On Error GoTo Loi
    Dim Cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
 
 If DataHienHanh=True then
 Set Cnn = CurrentProject.Connection ' Mở kết nối đến database hiện hành 
 
 else 
 'Kết nối với file Access khác hoặc SQl Server....thì dùng code sau: Ở Demo này sẽ dùng File không pass như bên dưới để các bạn dễ theo dõi
 ' Còn các ChuoiKetNoi còn lại để đây cho các bạn tham khảo thêm
 Set Cnn = New ADODB.Connection
 Dim ChuoiKetNoi As String
 Dim LinkFileData As String
 
    LinkFileData = CurrentProject.Path & "\DataTest.mdb"
'    'ChuoiKetNoi dung cho Access 2003 tro xuong khong co pass
        ChuoiKetNoi = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & LinkFileData & ";Persist Security Info=False"
 Cnn.ConnectionString = ChuoiKetNoi
 Cnn.CursorLocation = adUseClient ' Con trỏ phía Client, Nếu không khai báo sẽ báo lỗi khì dùng lệnh [Set .ActiveConnection = Nothing]
 Cnn.Open ' Mở kết nối đến database theo LinkFileData
    end if
    Set rst = New ADODB.Recordset 'Tạo Recordset mới
    With rst
    Set .ActiveConnection = Cnn 'Gán Recordset kết nối đến Connection cnn
                .LockType = adLockOptimistic ' Kiểu khoá áp đặt lên record hiện hành: Tham khảo thêm tài liệu nhé
                .CursorType = adOpenKeyset ' Cho biết kiểu của con trỏ Recordset được dùng : Tham khảo thêm tài liệu nhé
                .Source = "Select * from tblTest" ' tên table cần kết nối
                .Open ' mở kết nối đến bảng
    End With
 
 Cnn.BeginTrans 'Bắt đầu một transaction mới ( Cứ hiểu transaction nó là một giao dịch) => Bắt đầu giao dịch
    If rst.EOF Then Goto ThoatLoi 'Nếu không có dữ liệu thì thoát
    rst.MoveFirst ' Di chuyển đến mẫu tin đầu tiên
 'Bặt đầu vòng lặp từ đầu đến cuối cùng
    Do Until rst.EOF
            rst.Fields(1) = 555 ' Sửa dòng thứ nhất cột thứ 2 của table tblTest thành 555===> và cứ thế đến mẫu tin cuối cùng
            rst.Update ' ra lệnh cập nhật lệnh bộ nhớ transaction( vẫn chưa cập nhất lên Database của ta đâu nhe....
        rst.MoveNext ' Di chuyên đến dòng kế tiếp
    Loop
    ' Xác nhận lưu không? ==> xác nhận chập nhận giao dịch hay không?
    If MsgBox("Bạn có muốn Lưu các thay cập nhật trên không?", vbYesNo) = vbYes Then
        Cnn.CommitTrans    'Đồng ý giao dịch: Lưu các thay đổi và kết thúc transaction hiện hành
    Else
        Cnn.RollbackTrans  'Hủy giao dịch: Huỷ bỏ các thay đổi của transaction và kết thúc nó
    End If
 
 'Phần bắt lỗi trong quá trình làm việc
ThoatLoi:
    ' đóng rst, cnn và giải phóng bộ nhớ
    rst.Close
    Set rst = Nothing
 If DataHienHanh = False Then Cnn.Close
    Set Cnn = Nothing
        Exit Function
        
Loi:
        'Nếu lỗi phát sinh trong quá trình cập nhật sẽ chạy các đoạn lệnh dưới đây
        Cnn.RollbackTrans ' Hủy giao dịch
        Resume ThoatLoi
End Function