-
[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ì:
- Nếu dùng Data khác thì :Mã PHP:HamThemADOBeginTran hoặc HamThemADOBeginTran True
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 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
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 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
[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!