-
Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
AnNguyen > 02-08-23, 05:40 PM
Em sử dụng kết nối ADODB và thường đổ dữ liệu Recordset về subform.
Nhưng có 1 điểm mà em chưa biết giải quyết sao.
nếu sau mỗi câu lệnh :
Mã PHP:set SubformABC.form.recordset = rst
rst.close
conn.close
Thì sẽ xảy ra vấn đề nếu thao tác với subform như, lấy giá trị trong subform bằng
Mã PHP:While not rst.EOF
.......
wend
thì luôn bị lỗi do đã đóng kết nối và đóng Recordset.
Vì vậy trong ứng dụng của em luôn luôn không đóng kết nối và em cũng biết điều này ảnh hưởng đến tốc độ và hiệu năng sử dụng.
Nếu recordset được đổ vào listbox hoặc combobox thì dữ liệu vẫn xử lý được do dùng vòng lặp For là có thể lấy được giá trị trong đó ra.
Nhưng riêng với subform thì không thể.
Vậy có cách nào để cải thiện không ạ?
Em cảm ơn! -
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
ongke0711 > 02-08-23, 07:14 PM
- Em đóng connection thôi.
- Duyệt trong SubForm recordset Clone thử xem.
Set rs = Subform.RecordsetClone -
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
AnNguyen > 03-08-23, 08:47 AM
-
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
ongke0711 > 03-08-23, 05:51 PM
(03-08-23, 08:47 AM)AnNguyen Đã viết:
(02-08-23, 07:14 PM)ongke0711 Đã viết: - Em đóng connection thôi.
- Duyệt trong SubForm recordset Clone thử xem.
Set rs = Subform.RecordsetClone
Em làm cũng làm như thế rồi nhưng nó hay hiện ra như thế này anh ạ.
Hơi lạ nhỉ. Anh cũng có mấy cái ứng dụng đóng Connection thì vẫn xử lý Recordset được bình thường (đóng connection của Recordset đó thôi chứ không phải đóng Connection tới SQL Server.
Để làm cái file mẫu test thử xem. -
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
ongke0711 > 04-08-23, 02:53 AM
File đính kèm là demo tạo một Disconnected ADODB Recordset. Mục đính là sau khi lấy Recordset về rồi thì ngắt kết nối tới Database ở back end để tránh xung đột khi có người khác cũng đang kết nối sử dụng cùng một Table đó, không khoá record để nhập liệu v.v...
Chủ yếu xử lý một vài thuộc tính của nó thôi.
Còn cái lỗi khi Clone Recordset thì nó hiện hộp thoại "File Data Source", sửa lại chút như sau:
--> Form.Recordset.Clone chứ không phải Form.RecordsetClone
Mã PHP:Dim rsClone As Object
Set rsClone = Me.SubFormName.Form.Recordset.Clone
Link file: https://www.mediafire.com/file/nqd5oypwo...accdb/file
Đính kèm luôn CSDL Northwnd.bak để các bạn Restore nó trong SQL Server để chạy test.
Link: https://www.mediafire.com/file/5rn703gkp...D.bak/file
Mã PHP:Private Sub cmdXuLy_Click()
On Error GoTo XuLyError
Dim rs As Object 'ADODB.Recordset'
Dim sSQL As String
Set rs = CreateObject("ADODB.Recordset") 'New ADODB.Recordset'
sSQL = "Select * From dbo.Categories"
rs.CursorLocation = 3 'adUseClient'
rs.Open sSQL, oCnn, 3, 4 'adOpenstatic, adLockBatchOptimistic'
Set Me.sfmCat.Form.Recordset = rs
'Dong ket noi Recordset va ket noi toi Database --> tao 'Disconnected ADODB Recordset
Set rs.ActiveConnection = Nothing
oCnn.Close
'Test recordset'
Do Until rs.EOF
Debug.Print rs.Fields(1).Value
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Exit Sub
XuLyError:
If Err > 0 Then
MsgBox "Có loi phat sinh." & vbCrLf & "Ma loi: " & Err.Number _
& "Noi dung: " & Err.Description, vbCritical, "Get Recordset Function"
Exit Sub
End If
End Sub -
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
AnNguyen > 04-08-23, 09:16 AM
Em cảm ơn anh nhé. Em test đã ổn ạ.
Mã PHP:'Dong ket noi Recordset va ket noi toi Database --> tao 'Disconnected ADODB Recordset
Set rs.ActiveConnection = Nothing
oCnn.Close
Anh ơi cho em hỏi nếu sử dụng oCnn.Close thì nghĩa là ngắt kết nối đến máy chủ. Và khi thao tác gì đó nó sẽ kết nối lại.
Vậy việc đóng/mở kết nối liên tục có gây đến hiệu suất gì không ạ? -
RE: Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
ongke0711 > 04-08-23, 10:04 AM
(04-08-23, 09:16 AM)AnNguyen Đã viết: Anh ơi cho em hỏi nếu sử dụng oCnn.Close thì nghĩa là ngắt kết nối đến máy chủ. Và khi thao tác gì đó nó sẽ kết nối lại.
Vậy việc đóng/mở kết nối liên tục có gây đến hiệu suất gì không ạ?
Sql server cho phép hơn 32.000 kết nối, pool size từ 100 - 300 kết nối đồng thời nên việc giữ kết nối liên tục tới Database không thành vấn đề gì với SqlSV, chỉ cần ngắt kết nối tới Recordset là đủ rồi, tạo kết nối tới database sẽ mất thêm thời gian xử lý. Nếu không sợ ảnh hưởng gì đến băng thông cty thì cứ giữ kết nối database.
Nói thêm về cái Pool size của SQL Server, thực ra khi đóng kết nối tới Database SQL Sv thì nó vẫn còn lưu thông tin kết nối trong Pool, khi Có kết nối tới, nếu nó có sẳn trong Pool thì sẽ lấy thông tin đó kết nối tới CSDL rất nhanh, còn không thì sẽ tạo kết nối mới từ đầu. Do đó việc đóng kết nối tới Database SQL SV không hẳn mất nhiều thời gian để kết nối lại vì cơ chế Pool này của SQL SV (chứa 100 - 300 connections).