• [Demo] Hướng dẫn sử dụng BeginTrans (ADO)
  • [Demo] Hướng dẫn sử dụng BeginTrans (ADO)

    maidinhdan > 09-03-20, 04:37 PM

    Tiếp nối Demo: Hướng Dẫn [Demo] Hướng dẫn sử dụng UpdateBatch(ADO)

    Thực ra phải đặt tiêu là: [Demo] Hướng dẫn sử dụng Transaction trong ADO nhưng vì lý do sợ các bạn cần tìm thì không tìm thấy nên thôi, để tiêu đề như thế rồi tôi giải thích ở đây vậy: ok

    Transaction là gì ? ừ thì cứ hiểu nó là một giao dịch cho gọn cả nhà. và ADO có 03 loại transaction như sau:
    + BeginTrans: Bắt đầu giao dịch  -->Bắt đầu một transaction mới
    + CommitTrans:    'Đồng ý giao dịch --> Lưu các thay đổi và kết thúc transaction hiện hành
    + RollbackTrans : 'Hủy giao dịch --> Huỷ bỏ các thay đổi của transaction và kết thúc nó

    Cứ tưởng tượng thế này: Ta ra ngoài siêu thị.
    1---> BeginTrans: Khi bắt đầu lấy xe đẩy và chất đầy đồ rồi ra ngoài quầy cho Thu ngân thanh toán
    2---> Thu ngân hỏi: --> Anh đồng ý trả tiền cho mớ đồ này không? --> (Phát sinh sự kiện: CommitTrans hoặc RollbackTrans )
    3=> Nếu đồng ý giao dịch: trả tiền và ra về: ==>CommitTrans
    => Không đồng ý: thì anh cứ về đi.... hàng hóa để lại, tôi sẽ để lại đúng nơi anh đã lấy nó.==> RollbackTrans (Thần thánh nhất là chỗ này đây...lở sét đánh điện giật thì mọi chuyện về như cũ như phi tây du ký mối tình ngoại truyện quay ngược thời gian..)

    Đã chưa, Nắm rõ khái niệm rồi vào mần nó thôi.

    1. Hàm thêm mới sử dụng ADO dùng Transaction( BeginTrans, CommitTrans, RollbackTrans ):
    Hàm này có thể phát biểu như sau:
    - Nếu dùng Database hiện hành thì:
    Mã PHP:
    HamThemADOBeginTran hoặc HamThemADOBeginTran True 
    - Nếu dùng Data khác thì :
    Mã PHP:
    HamThemADOBeginTran False 

    * Hàm chi tiết sau: giải thích đên từng cetimét trờ
    Mã PHP:
    '---------------------------------------------------------------------------------------
    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 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ịchLư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 


    1. Hàm sửa dụng ADO dùng Transaction( BeginTrans, CommitTrans, RollbackTrans ):

    Mã PHP:
    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 ClientNế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ànhTham 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ịchLư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 

    [b]Đính kèm Demo Minh họa file mdb không khóa
    Chờ tiếp Demo thứ 3: BeginTransDAO --> CommitTrans --> RollbackTrans


    Thân mến!