• Xử lý dữ liệu trong subform sau khi đã bị đóng Recordset trước đó
  • 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

    (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ình: fheP3uo.png]
  • 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


    [Hình: hwqFbOYl.png]



    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 sSQLoCnn34                    '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.DescriptionvbCritical"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).