• Set combobox = ADOrecordset
  • Set combobox = ADOrecordset

    mrsiro > 18-10-18, 06:00 PM

    Chào mọi người. 
    Làm thế nào để set recordset của 1 comboxbox = ADOrecordset. Trong đó ADOrecordset lấy nguồn từ 1 ADOcommand execute 1 storeprocedure có parameter trên SQL server.
    Mình có dùng thử: Set me.combobox.recordset = ADOcom.excute thì lỗi.
  • RE: Set combobox = ADOrecordset

    ongke0711 > 19-10-18, 12:31 AM

    - Khi Connection.Execute, kết quả trả về sẽ được lưu trong một đối tượng Recordset mà câu lệnh trên của bạn không có đối đối tựơng rs nào để lưu nên báo lỗi.
       Set rs=cnn.execute
       Set cbo.recordset = rs
  • RE: Set combobox = ADOrecordset

    hieuvn > 19-10-18, 09:43 PM

    Bạn xử lý như sau:

    giả sử là bạn get dược recordset rồi nhé, khai báo là rs

    Dim i As Long, s As String,cbo As Object
    'cbo  là tên combobox của bạn
    With rs
           .MoveFirst
           Do Until .EOF
              s = ""
              For i = 0 To rs.Fields.Count
                  s = s & IIf(i = 0, "", ";") & rs.Fields(i).Value
                  
              Next i
              cbo.AddItem s
              .MoveNext
           Loop
     End With

    chỉ có vậy thôi happy
  • RE: Set combobox = ADOrecordset

    mrsiro > 19-10-18, 10:21 PM

    Bạn hieuvn cho mình hỏi, nếu dùng dao thì có thể sử dụng form.filter property, còn ado recordset thì làm cách nào để filter. Ý mình là load recordset sau đó disconect kết nối, lúc này mình đã get được 1 cục recordset và mình muốn filter trên cục này thì phải làm thế nào.

    Để dễ tưởng tượng thì ví dụ cụ thể thế này:
    - Mình có 1 form với 1txtfilter, tại onload của form mình cho kết nối và load recordset về, gán recordset cho form, sau đó ngắt kết nối. Giờ mình muốn cục recordset này sẽ filter theo giá trị của txtfilter thì làm thế nào.
  • RE: Set combobox = ADOrecordset

    hieuvn > 19-10-18, 10:37 PM

    Nếu là mình thì sẽ dùng giá trị từ txtfilter làm tham số (parameter) cho query (stringSQL) rồi mới load recordset từ đó chứ không lấy 1 cục về sẽ chậm hơn.
  • RE: Set combobox = ADOrecordset

    mrsiro > 19-10-18, 10:43 PM

    Mình nghĩ nhanh hay chậm tùy trường hợp. Mình có sử dụng qua 1 số phần mềm, module báo cáo của họ thiết kế thế này, có chọn thời gian để xuất báo cáo, đây chính là parameter để lọc recordset load về, sau khi load về thì trên form của họ có thiết kế các textbox để filter cục recordset đó chứ ko load lại theo các txtfilter nữa. Và khi người dùng muốn khoảng thời gian khác thì mới tiến hành load lại recordset.
    Đây chính là ý mình muốn. Hi vọng bạn có thể giúp mình bởi vì mình tìm kiếm đã lâu mà ko có kết quả.
  • RE: Set combobox = ADOrecordset

    hieuvn > 20-10-18, 10:30 AM

    Có 1 cách hơi củ chuối là bạn lưu recordset vào table rồi tạo query làm recordset cho form hoặc report. Với Ms Access thì hiếm có tài liệu về vấn đề này, bên .Net thì bạn có thể dùng BindingSource để filter. Túm lại theo mình có 2 cách:
    1,dùng parameter trên form đưa vào storeprocedure mỗi lần request (có thể bạn phải thiết kế lại storeprocedure).
    2, Lưu recordset vào table rồi query.
  • RE: Set combobox = ADOrecordset

    mrsiro > 20-10-18, 03:11 PM

    khó nhỉ, mình thấy cách đưa luôn cả filter vào parameter rồi load lại record nó còn lâu hơn cách mình đang tìm.

    Như cụ thể trong ví dụ:
    - Khi parameter là khoảng thời gian cần tìm, thì khi load dữ liệu ví dụ mất 10 phút chẳng hạn. Sau đó đó dùng filter theo kiểu mình muốn thì nó ra ngay, có nghĩa chỉ mất 10 phút load lần đầu.
    - Còn đưa cả txtfilter vào parameter để load thì cho load mất 5 phút đi, nhưng cứ mỗi lần txtfilter thay đổi giá trị lại mất 5 phút để load <= đây chính là vấn đề mình nghĩ nó ko tối ưu như cái mình đang tìm kiếm.
  • RE: Set combobox = ADOrecordset

    ongke0711 > 22-10-18, 01:27 AM

    (20-10-18, 03:11 PM)mrsiro Đã viết: khó nhỉ, mình thấy cách đưa luôn cả filter vào parameter rồi load lại record nó còn lâu hơn cách mình đang tìm.

    Như cụ thể trong ví dụ:
    - Khi parameter là khoảng thời gian cần tìm, thì khi load dữ liệu ví dụ mất 10 phút chẳng hạn. Sau đó đó dùng filter theo kiểu mình muốn thì nó ra ngay, có nghĩa chỉ mất 10 phút load lần đầu.
    - Còn đưa cả txtfilter vào parameter để load thì cho load mất 5 phút đi, nhưng cứ mỗi lần txtfilter thay đổi giá trị lại mất 5 phút để load <= đây chính là vấn đề mình nghĩ nó ko tối ưu như cái mình đang tìm kiếm.


    Tôi thấy bạn không bắt tay vào làm test thử mà cứ tự suy đoán chủ quan.
    Bạn nói đã sử dụng qua mấy phần mềm và module của họ load nguyên cục Recordset về vậy sao không xem và bắt chước code của họ làm thử luôn. Bạn tìm không thấy demo dùng cách như bạn muốn vì ít ai dùng nên không có demo là vậy.

    Sẳn tôi làm demo cho bạn xem các kiểu và so sánh thời gian các cách để biết thực tế chứ không phải suy đoán.
    - Tôi demo 2 loại dữ liệu back end: Ms Access và SQL Server.
    - Dùng ADO để kết nối và lấy dữ liệu
    - Test  trường hợp: Load về 1 cục Recordset rồi Filter; Filter trực tiếp trong câu lệnh SQL rồi kết nối lấy dữ liệu và ngắt kết nối.
    - Riêng đối với back end là SQL Server thì tôi test 3 trường hợp: Load về 1 cục; dùng Paramterized Query và gọi Stored Proc mỗi lần filter. Đối vối SQL Server tôi chỉ test trên máy local. Bạn tự test kết nối qua internet.
    - Mượn tạm dữ liệu của a ledangvan: 23.265 records để test.

    [/url][Hình: 45423100432_b0494b7d93_c.jpg]  [url=https://flic.kr/p/NweKp8][Hình: 30534588657_6f174c14a9_c.jpg]

    => Kết quả:
    - Thời gian gần như nhau khi dùng ADO.Filter và câu lệnh SQL filter mỗi lần kết nối. Nhưng riêng dùng ADO.Filter phải thêm thời gian load nguyên cục Recordset về. -> Cách dùng ADO vừa tốn bộ nhớ (vì cục Recordet lớn chiếm dụng) mà thời gian filter không nhanh hơn.
    - Đối với SQL Server: một phát hiện là dùng Stored Proc. thì tốn thời gian gấp đôi so với dùng Parameterized Query nhưng vẫn = ADO.Filter
    Tóm lại tôi thấy dùng Parameterized Query với ADO là nhanh nhất.

    Theo tôi biết thì Parameterized Query cũng được SQL Server tạo Execution Plan như Stored Proc nên những lần chạy filter sau sẽ tận dụng lại plan này để xử lý nhanh hơn.
    Có một thử nghiệm trên table 43.000 records thì Parameterized Query chạy nhanh hơn Dynamic SQL khoảng 30%, thời gian CPU xử lý cũng ít hơn và chiếm bộ nhớ cho execution plan cũng ít hơn.

    [Hình: 44561407515_1c0fa0ed08_o.png]


    Link demo: http://www.mediafire.com/file/608ac83860...g.rar/file
     
    Trong file nén tôi có đính kèm:
    - 2 file script để tạo database "Test" cho SQL Server. Một file cho SQL Server 2005 và một cho 2008.
    - 1 file Access "db10.mdb" để test back end Access.