-
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
mrsiro > 19-11-18, 09:13 AM
Chào bạn ongke, mình dùng vòng lặp thêm recordset theo kiểuthì thấy có vẻ nhanh hơn sử dụngMã:DAOrecordset!field(1) = ADOrecordset!field(1)
Mã:docmd.runsql "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"
-
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
ongke0711 > 19-11-18, 12:17 PM
(19-11-18, 09:13 AM)mrsiro Đã viết: Chào bạn ongke, mình dùng vòng lặp thêm recordset theo kiểu
thì thấy có vẻ nhanh hơn sử dụngMã:DAOrecordset!field(1) = ADOrecordset!field(1)
Mã:docmd.runsql "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"
Bạn nên dùng hàm API GetTickCount của Windows để test thì rõ hơn.
Riêng đối với RunSQL thì tốc độ nó theo thứ tự như thế này:
Docmd.RunSQL --> CurrentDb.Execute --> DBEngine.Execute
Trong đó DBEngine(0)(0).Execute là nhanh nhất.
RunSQL nó chậm hơn vì nó phải xử lý thông qua một lớp Query nữa để lấy các tham số trên Form v.v.. rồi mới đưa lệnh vô cho JET engin xử lý nên sẽ chậm hơn .Execute -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
mrsiro > 19-11-18, 03:46 PM
Cám ơn bạn ongke, mình lại có thêm 1 kinh nghiệm bổ ích rồi. Trước giờ toàn dùng docmd.runsql.
Vậy với trường hợp trên thì dùng :
Hay dùng:Mã:DAOrecordset!field(1) = ADOrecordset!field(1)
Cái nào tối ưu hơn.Mã:CurrentDb.Execute "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"
-
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
ongke0711 > 19-11-18, 09:21 PM
- Đối với "Insert Into...", thì mỗi lần chạy Insert nó sẽ mở / đóng table. Do đó nếu dùng dạng vòng lặp để thêm từng record thì kiểu này không hiệu quả (nhanh) bằng AddNew của Recordset.
- Insert into...: dùng tốt nhất khi thêm hàng loạt records vào table. Nó sẽ nhanh hơn AddNew.
Đối với ADO Recordset thì chỉ có cách loop từng record và Addnew vào table chứ không có cách Insert hàng loạt record. -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
hoabattu3387 > 20-11-18, 04:42 PM
(19-11-18, 09:21 PM)ongke0711 Đã viết: - Đối với "Insert Into...", thì mỗi lần chạy Insert nó sẽ mở / đóng table. Do đó nếu dùng dạng vòng lặp để thêm từng record thì kiểu này không hiệu quả (nhanh) bằng AddNew của Recordset.
cho mình hỏi chút:
- Insert into...: dùng tốt nhất khi thêm hàng loạt records vào table. Nó sẽ nhanh hơn AddNew.
Đối với ADO Recordset thì chỉ có cách loop từng record và Addnew vào table chứ không có cách Insert hàng loạt record.
1. trong câu lệnh db.Execute "DELETE * FROM " & sTableImportTemp, dbFailOnError khi nào cần thêm dbfailonerror?
2. các giá trị của cursortype, locktype, option sử dụng như nào khi open recordset ạ? locktype trường hợp này bạn Dân chọn là adLockBatchOptimistic để có thể update batch đúng không ạ? còn các trường hợp khác thì sao ạ? mong các bạn chỉ giáo. -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
ongke0711 > 21-11-18, 11:22 AM
(20-11-18, 04:42 PM)hoabattu3387 Đã viết: cho mình hỏi chút:
1. trong câu lệnh db.Execute "DELETE * FROM " & sTableImportTemp, dbFailOnError khi nào cần thêm dbfailonerror?
2. các giá trị của cursortype, locktype, option sử dụng như nào khi open recordset ạ? locktype trường hợp này bạn Dân chọn là adLockBatchOptimistic để có thể update batch đúng không ạ? còn các trường hợp khác thì sao ạ? mong các bạn chỉ giáo.
1. Tham số dbFailOnError: khi có tham số này thì khi code chạy, nếu có phát sinh lỗi thì nó sẽ trả dữ liệu xử lý về hiện trạng ban đầu (khi chưa chạy code) , tránh dữ liệu bị cập nhật nữa vời.
2. Khi dùng UpdateBatch thì buộc phải mở Table dữ liệu ở trạng thái "adLockBatchOptimistic" để có thể update hàng loạt.
Còn về Cursor và Lock bạn ngâm cứu lý thuyết của thư viện ADODB nhé. Làm biếng dịch vì nó nhiều quá.
- Bài này của bạn Dân có giới thiệu về ADO đây: http://thuthuataccess.com/forum/thread-9259.html
- Link của MS: https://docs.microsoft.com/en-us/sql/ado...erver-2017 -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
mrsiro > 21-11-18, 03:47 PM
Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.
Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào. -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
ongke0711 > 21-11-18, 04:43 PM
(21-11-18, 03:47 PM)mrsiro Đã viết: Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.
Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào.
ADO recordset nó nằm trên memory rồi thì không bị ảnh hưởng bởi kết nối mạng nhé. Nếu bị lỗi bộ nhớ thì có khả năng xảy ra. Bạn ngâm cứu cái DBEngin.CommitTran nhé. -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
hoabattu3387 > 22-11-18, 12:54 PM
(21-11-18, 11:22 AM)ongke0711 Đã viết: [quote="hoabattu3387" pid='40870' dateline='1542703341']
- Link của MS: https://docs.microsoft.com/en-us/sql/ado...erver-2017
Nhờ bạn giải thích giúp đoạn này:
The typical default cursor type, called a forward-only (or non-scrollable) cursor, can move only forward through the result set. A forward-only cursor does not support scrolling (the ability to move forward and backward in the result set); it only supports fetching rows from the start to the end of the result set. With some forward-only cursors (such as with the SQL Server cursor library), all insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor.
“Result set” ơ đây là nói về việc thiết lập kết quả của open recordset? Con trỏ này chỉ có thể đi chuyển về phía trc là sao bạn? -
RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access
maidinhdan > 22-11-18, 05:24 PM
Câu số 1
(21-11-18, 03:47 PM)mrsiro Đã viết: Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.
Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào.
Trả lời : Cách dùng Rollback, có 2 hướng: 1 là dùng DAO, 2 là dùng ADO
* Với DAO thì dùng như sau:
Mã PHP:Function BeginTransDAO()
On Error GoTo Loi
Dim wrk As DAO.Workspace
Dim dbX As DAO.Database
Set dbX = wrk.OpenDatabase("e:\File Access.mdb")
'Bắt đầu tạo điểm khôi phục transaction
wrk.BeginTrans
'Chèn các câu lệnh Thêm, Sửa, Xóa....
dbx.Execute "INSERT INTO ............................."
'Commit the transaction
wrk.CommitTrans dbForceOSFlush
ThoatLoi:
'Clean up
wrk.Close
Set dbX = Nothing
Set wrk = Nothing
Exit Function
Loi:
'Khôi phục trạng thái ban đầu
wrk.Rollback
Resume ThoatLoi
End Function
* Với ADOthì dùng như sau:
Mã PHP:Function BeginTransADO()
On Error GoTo Loi
'Dat ten bien
Dim Cnn As ADODB.Connection
Dim rst As ADODB.Recordset
' Mo ket noi ADO den file Access
Set Cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
SQL= "SELECT * FROM tblTest"
rst.Open SQL, cnn, adOpenDynamic, adLockPessimistic, adCmdTable
'Bắt đầu tạo điểm khôi phục transaction
Cnn.BeginTrans
'Chèn các câu lệnh Thêm, Sửa, Xóa....
' Ví dụ duyệt qua các mẫu tin và set cột đầu tiên lại bằng 1 hết
rst.MoveFirst
Do Until rst.EOF
rst.Fields(0) = 1
rst.Update
rst.MoveNext
Loop
' Xac nhan co muon Luu khong
If MsgBox("Save all changes?", vbYesNo) = vbYes Then
Cnn.CommitTrans 'Hoan thanh lenh
Else
Cnn.RollbackTrans 'Khoi phuc
End If
ThoatLoi:
'Clean up
rst.Close
Cnn.Close
Set rst = Nothing
Set Cnn = Nothing
Exit Function
Loi:
'Khôi phục lại điểm transaction
Cnn.RollbackTrans
Resume ThoatLoi
End Function
Câu số 2:
(22-11-18, 12:54 PM)hoabattu3387 Đã viết: Nhờ bạn giải thích giúp đoạn này:
Đoạn này muốn nói về kiểu truy xuất dữ liệu qua ADO không dùng con trỏ.
The typical default cursor type, called a forward-only (or non-scrollable) cursor, can move only forward through the result set. A forward-only cursor does not support scrolling (the ability to move forward and backward in the result set); it only supports fetching rows from the start to the end of the result set. With some forward-only cursors (such as with the SQL Server cursor library), all insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor.
“Result set” ơ đây là nói về việc thiết lập kết quả của open recordset? Con trỏ này chỉ có thể đi chuyển về phía trc là sao bạn?
Mặc định là kiểu: Forward-Only với tham số của nó là adOpenForwardOnly : Không dùng con trỏ - ta chỉ có thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi.
Sơ lược về Truy xuất dữ liệu sử dụng công nghệ ADO : Làm việc với con trỏ
* ADO hỗ trợ một số kiểu con trỏ. Ngoài việc cung cấp hỗ trợ duyệt qua từng mẩu tin tại một thời điểm, các kiểu con trỏ khác nhau cho phép ta điều khiển cách quản lý của một Recordset
- Các kiểu con trỏ của đối tượng connection: 2 kiểu
+ Tạo con trỏ phía Client;
+ Tạo con trỏ phía Server
Mục đích: Chọn con trỏ Client nghĩa là ADO và OLEDB xử lý các hoạt động của con trỏ. Con trỏ kiểu Client không có sẵn trên Server. Trong ADO ta có thể tạo một Recordset không kết nối, cho phép ta thao tác với các mẩu tin mà không có kết nối thường xuyên đến Server. Khả năng này là một chức năng của thư viện con trỏ phía Client
- Các kiểu con trỏ của đối tượng Recordset: gồm 4 kiểu
1. Forward-Only (adOpenForwardOnly): Không dùng con trỏ - ta chỉ có thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi
2. Keyset(trong DAO được gọi là Dynaset) (adOpenKeyset): Ta không thể thấy các mẩu tin mới do người sử dụng khác thêm và, nhưng khi họ sửa đổi, hay xoá mẩu tin sẽ ảnh hưởng đến Recordset ta đang làm việc; đây là kiểu con trỏ hiệu quả nhất, đặc biệt là khi Recordset khá lớn
3. Dynamic(adOpenDynamic): Ta có thể thấy toàn bộ thay đổi trên dữ liệu do người sử dụng khác thực hiện trong khi ta đang mở Recordset; đây là kiểu con trỏ ít hiệu quả nhất, nhưng mạnh mẽ
4. Static (trong DAO gọi là snap-short) (adOpenStatic): Bản sao của toàn bộ dữ liệu của một Recordset; kiểu này đặc biệt hữu dụng khi ta đang tìm kiếm dữ liệu hay ta đang thi hành báo cáo; kiểu con trỏ này rất hữu dụng cho những Recordset nhỏ.
Mục đích: Mỗi kiểu con trỏ điều có những ưu điểm riêng của nó tùy vào ngữ cảnh mà bạn muốn xử lý. Ví như lý do nếu ta chỉ hiển thị dữ liệu thì chọn con trỏ Forward-Only thay vì các kiểu con trỏ khác vì sẽ nhanh hơn.
Đính kèm chi tiết tài liệu để bạn tham khảo: Chú ý xem trang 17-18
Có gì thiếu sót các Anh/Chị khác bổ sung thêm.