Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ταχύτατη εμφάνιση Records στο DataGridView

Îåêßíçóå áðü ôï ìÝëïò Dataman. Τελευταία δημοσίευση από το μέλος Dataman στις 02-08-2008, 01:02. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  31-07-2008, 11:12 43824

    Ταχύτατη εμφάνιση Records στο DataGridView

    Χαιρετώ (πάλι) την παρέα

    Δουλεύω σε Visual Basic 2008 kai σε μία φόρμα χρησιμοποιώ ένα TextBox και ένα DataGridView control.

    Η βάση που διαβάζω και εμφανίζω στο DataGridView είναι σε Access 2003 και το table που εμφανίζω έχει περίπου 500.000 records.

    Το TextBox το χρησιμοποιώ (από το TextChanged) για να φιλτράρω ta records χρησιμοποιώντας την Like και να εμφανίζονται στην λίστα του DataGridView σύμφωνα με τα κριτήρια που θα δώσω στο SQL string.

    Καλά έως εδώ, το πρόβλημά μου είναι ότι εάν υπάρχουν πολλά records προς εμφάνιση, τότε καθυστερεί (λογικό διότι τα εμφανίζει όλα στο DataGridView).

    Το ερώτημα είναι εάν υπάρχει κάποιος τρόπος να εμφανίζονται μερικά από τα records (προκειμένου να κερδίσω χρόνο) ή άλλος τρόπος ταχύτατης εμφάνισης δεδομένων;

    Σημειωση:
    Στην Visual Basic 6 έκανα ακριβώς το ίδιο με Data Control και DBGrid control. Το DBGrid εμφάνιζε ταχύτατα τα records (άσχετα με τον όγκο).

    Ευχαριστώ πολύ
  •  31-07-2008, 13:11 43826 σε απάντηση της 43824

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Μπορείς να χρησιμοποιήσεις το Virtual Mode του DataGridView για να μην έχεις καθυστερίσεις. Δες εδώ: http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

    Από εκεί και πέρα, εναλλακτικά μπορείς να κάνεις το query μαζί με τα φίλτρα και κάθε φορά να φέρνεις μόνο τα φιλτραρισμένα δεδομένα και όχι όλες τις 500.000 εγγραφές (έτσι κι αλλιώς είναι άχρηστες για το χρήστη αφού δεν μπορεί να τις κάνει digest). Εγώ αυτό θα έκανα...

    Στη VB6 αυτό που περιγράφεις δούλευε και όταν άνοιγες το ADO με client-side cursor; Γιατί έχω μια υποψία ότι μιλάς για server-side cursor πράγμα που σημαίνει ότι ποτέ δεν είχες πραγματικά στον client τα 500Κ records.


    Vir prudens non contra ventum mingit
  •  31-07-2008, 18:55 43837 σε απάντηση της 43826

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    KelMan:

    Μπορείς να χρησιμοποιήσεις το Virtual Mode του DataGridView για να μην έχεις καθυστερίσεις. Δες εδώ: http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

    Και πάλι δεν έχει ταχύτητα, το ίδιο είναι.

    KelMan:

    Από εκεί και πέρα, εναλλακτικά μπορείς να κάνεις το query μαζί με τα φίλτρα και κάθε φορά να φέρνεις μόνο τα φιλτραρισμένα δεδομένα και όχι όλες τις 500.000 εγγραφές (έτσι κι αλλιώς είναι άχρηστες για το χρήστη αφού δεν μπορεί να τις κάνει digest). Εγώ αυτό θα έκανα...

    Φαντάσου ότι υπάρχει μία βάση με διάφορα είδη (500.000) και στο TextBox ψάχνεις για το είδος 'ΚΑΡΕΚΛΑ'. Λογικά όταν γράψεις το 'Κ' θα φιλτράρει και θα εμφανίσει τα είδη που αρχίζουν από 'Κ', όταν γράψεις και το 'Α' θα εμφανίζει τα είδη που αρχίζουν από 'ΚΑ' κοκ. Εάν τώρα τα είδη είναι 400.000 που αρχίζουν από 'Κ', θα υπάρχει καθυστέριση μέχρι την επόμενη πληκτρολόγηση και δεν θα υπάρχει ρεαλισμός στην εφαρμογή. Φαντάσου τι θα γίνει εάν πληκτρολογίσω 'Κ' και διαπιστώσω ότι έκανα λάθος και διαγράψω το 'Κ', τότε θα εμφανίσει όλη την database στο DataGridView (μεγάλη καθυστέριση). Είναι δυνατόν να γίνεται στην VB6 και να μην γίνεται στην VB2008; μήπως υπάρχει άλλος τρόπος για την συγκεκριμένη λειτουργία; (είμαι νέος χρήστης στην VB2008).

    KelMan:

    Στη VB6 αυτό που περιγράφεις δούλευε και όταν άνοιγες το ADO με client-side cursor; Γιατί έχω μια υποψία ότι μιλάς για server-side cursor πράγμα που σημαίνει ότι ποτέ δεν είχες πραγματικά στον client τα 500Κ records.


    Την λειτουργία αυτή την δούλευα μόνο με το Data και τι DBGrid Control.
  •  31-07-2008, 19:48 43839 σε απάντηση της 43837

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Dataman:
    Φαντάσου ότι υπάρχει μία βάση με διάφορα είδη (500.000) και στο TextBox ψάχνεις για το είδος 'ΚΑΡΕΚΛΑ'. Λογικά όταν γράψεις το 'Κ' θα φιλτράρει και θα εμφανίσει τα είδη που αρχίζουν από 'Κ', όταν γράψεις και το 'Α' θα εμφανίζει τα είδη που αρχίζουν από 'ΚΑ' κοκ. Εάν τώρα τα είδη είναι 400.000 που αρχίζουν από 'Κ', θα υπάρχει καθυστέριση μέχρι την επόμενη πληκτρολόγηση και δεν θα υπάρχει ρεαλισμός στην εφαρμογή. Φαντάσου τι θα γίνει εάν πληκτρολογίσω 'Κ' και διαπιστώσω ότι έκανα λάθος και διαγράψω το 'Κ', τότε θα εμφανίσει όλη την database στο DataGridView (μεγάλη καθυστέριση). Είναι δυνατόν να γίνεται στην VB6 και να μην γίνεται στην VB2008; μήπως υπάρχει άλλος τρόπος για την συγκεκριμένη λειτουργία; (είμαι νέος χρήστης στην VB2008).

    Ένα από τα άβατα προβλήματα, είναι ότι θεωρείς ότι θα έπρεπε να δουλέψουν 2 διαφορετικές τεχνολογίες το ίδιο... Δεν είναι ίδιες, είναι παρόμοιες. Το ADO έκανε πολλά βρώμικα κόλπα για να επιτύχει perfomance, που τώρα δεν υπάρχουν. Δεν υπάρχουν όχι γιατί, είναι άχρηστα ή μη παραγωγικά, αλλά γιατί έχουμε αλλάξει τον τρόπο σκέψεώς μας, άρα και την φιλοσοφία που φτιάχνουμε τις εφαρμογές μας και δεν τα χρειαζόμαστε.

    Στην περίπτωση που αναφέρεις:

    • Δηλαδή πιστεύεις ότι αν είχες τον τρόπο να δείξεις πολύ γρήγορα ή και άμεσα 400000 γραμμές στο χρήστη, θα του ήταν χρήσιμες;
    • Η αν ο χρήστης είχε 500000 γραμμές μπροστά του και πληκτρολογώντας χαρακτήρες, το πρόγραμμα μπορούσε να τον οδηγήσει άμεσα στην πρώτη εγγραφή που έκανε match το search θα ήταν ένα αποδεκτό interface;

    Θα πρότεινα:

    • Να μην γίνεται αναζήτηση αν ο χρήστης δεν γράψει τουλάχιστον 3-4 χαρακτήρες: Τα αποτελέσματα θα είναι πολύ πιο κοντά σε αυτό που αναζητά, θα βρίσκει αυτό που θέλει πιο εύκολα και δεν θα εκνευρίζεται.
    • Η αναζήτηση να ξεκινά από interaction του χρήστη: Μπορεί ο χρήστης να ξέρει ακριβώς τι θέλει, γιατί να σπαταλιούνται resources από πρόγραμμα που θα προσπαθεί να τον βοηθήσει, ενώ στην πραγματικότητα δεν το χρειάζεται;
    • Να οριστεί στο πρόγραμμα ότι θα επιστρέφει μόνο, πχ, τις πρώτες 100 εγγραφές: Έτσι θα ξέρουμε ότι ο χρήστης δεν θα "μπουκώνει" από αυτά που θα εμφανίζονται μπροστά του, και εύκολα θα μπορεί να συμπεράνει αν έχει βρει αυτό που ζητάει.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  31-07-2008, 20:24 43840 σε απάντηση της 43839

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    George J. Capnias:
    • Δηλαδή πιστεύεις ότι αν είχες τον τρόπο να δείξεις πολύ γρήγορα ή και άμεσα 400000 γραμμές στο χρήστη, θα του ήταν χρήσιμες;
    • Η αν ο χρήστης είχε 500000 γραμμές μπροστά του και πληκτρολογώντας χαρακτήρες, το πρόγραμμα μπορούσε να τον οδηγήσει άμεσα στην πρώτη εγγραφή που έκανε match το search θα ήταν ένα αποδεκτό interface;

    Συμφωνώ απόλυτα ότι δεν ενδιαφέρει τον χρήστη να εμφανίζονται όλες οι εγγραφές αλλά θέλω να το χρησιμοποιήσω για συμβατότητα χειρισμού με την εφαρμογή που σχεδιάστηκε για την VB6 (με τον τρόπο που περιέγραψα πιο πάνω).


    George J. Capnias:
    • Να οριστεί στο πρόγραμμα ότι θα επιστρέφει μόνο, πχ, τις πρώτες 100 εγγραφές: Έτσι θα ξέρουμε ότι ο χρήστης δεν θα "μπουκώνει" από αυτά που θα εμφανίζονται μπροστά του, και εύκολα θα μπορεί να συμπεράνει αν έχει βρει αυτό που ζητάει.

    Ακριβώς αυτό θα μπορούσε να εφαρμοστεί στην εφαρμογή.
    Μπορεί να γίνει αυτό από το Query? (SQL).


  •  31-07-2008, 21:16 43842 σε απάντηση της 43840

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Dataman:
    Ακριβώς αυτό θα μπορούσε να εφαρμοστεί στην εφαρμογή.
    Μπορεί να γίνει αυτό από το Query? (SQL).

    Ναι, μπορεί να γίνει με το ΤOP, δίνοντας μαζί, είτε τον αριθμό εγγραφών που θες να γυρίσει το SELECT, ή το ποστοστό επό των εγγραφών που θες να γυρίζει επί του συνόλου. Δες την σχετική βιβλιογραφεία στο MSDN Library.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  31-07-2008, 22:13 43843 σε απάντηση της 43842

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Χρησιμοποίησα την ΤΟΡ και πράγματι είδα τεράστια διαφορά, αλλά... δεν είμαι ικανοποιημένος με το αποτέλεσμα (ταχύτητα).
    Όλα πήγαν καλά μέχρι την στιγμή που έδωσα και την εντολή ORDER BY. Εκεί απογοητεύτηκα.

    Παραθέτω τον κώδικα, γιατί έχω την εντύπωση ότι κάτι άλλο φταίει:

       Private Sub TextBox8_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox8.TextChanged
          Dim strSQL As String = "Select TOP 10 SURNAME From ELLADA Where SURNAME Like '" & TextBox8.Text & "%' ORDER BY SURNAME"
          Dim DBR_SQL As OleDb.OleDbCommand              
          Dim DBR_DataAdapter As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter()
          Dim DBR_DataSet As DataSet = New DataSet()    

          Cursor = Cursors.WaitCursor

          DBR_Con.ConnectionString = DB_ConString
          DBR_Con.Open()

          If DBR_Con.State = ConnectionState.Open Then
             DBR_SQL = New OleDb.OleDbCommand(strSQL, DBR_Con)
             DBR_DataAdapter.SelectCommand = DBR_SQL
             DBR_DataAdapter.Fill(DBR_DataSet, "SURNAME")

             DataGridView1.DataSource = DBR_DataSet.Tables("SURNAME")

             DBR_SQL.Dispose()
             DBR_DataAdapter.Dispose()
             DBR_DataSet.Dispose()
          End If

          DBR_Con.Close()

          Cursor = Cursors.Default
       End Sub

  •  31-07-2008, 22:27 43844 σε απάντηση της 43843

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Καλύτερα να κάνεις την ταξινόμηση στον client, αφού φέρεις τα data. Αν αντί να κάνεις bind απευθείας το DataTable στο DataGridView, χρησιμοποιήσεις ενδιάμεσα ένα BindingSource (δηλαδή, κάνεις bind το BindingSource στο DataTable και το DataGridView πάνω στο BindgSource) τότε θα μπορείς να χρησιμοποιήσεις το Sort property του BindingSource για να κάνεις ό,τι sorting θες. Για τον client είναι εύκολη η ταξινόμηση...

     


    Vir prudens non contra ventum mingit
  •  31-07-2008, 23:02 43846 σε απάντηση της 43844

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    KelMan:
    χρησιμοποιήσεις ενδιάμεσα ένα BindingSource (δηλαδή, κάνεις bind το BindingSource στο DataTable και το DataGridView πάνω στο BindgSource) τότε θα μπορείς να χρησιμοποιήσεις το Sort property του BindingSource για να κάνεις ό,τι sorting θες.


    ΟΚ Τελικά το έκανα με αυτόν τον τρόπο και δεν έχει καθυστέριση (πάντως υπάρχει καθυστέρηση σε σχέση με την VB6, το ξαναλέω κι ας σας κούρασα).

             BindingSource1.DataSource = DBR_DataSet.Tables("SURNAME")
             BindingSource1.Sort = "SURNAME"
             DataGridView1.DataSource = BindingSource1

    Υπάρχει και μία λειτουργία SortMode στο DataGridView και έλεγα μηπως απο εκεί γίνει κάτι. Τι είναι άραγε αυτό;
    Η λειτουργία σε γενικές γραμμές του BindingSource ποια είναι;

    Πολές ερωτήσεις μαζί ε? sory
  •  31-07-2008, 23:42 43852 σε απάντηση της 43846

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Πρόλαβες και το βρήκες προν σου απαντήσω. Πάντως, το BindingSource λειτουργεί ως ενδιάμεσος και σου επιτρέπει να έχεις ταξινομήσεις και φιλτραρίσματα στο DataSource που βλέπει. Με αυτόν τον τρόπο μπορείς πάνω στα ίδια data να έχεις πολλαπλά views (πχ δύο grids πάνω στο ίδιο DataTable που το καθένα να δέιχνει άλλα πράγματα, με διαφορετικά φίλτρα και διαφορετική ταξινόμηση) πράγμα που δεν μπορείς να κάνεις αν δεν χρησιμοποιήσεις του BindingSource.

    Ως προς τη VΒ6 που επιμένεις, θα με κάνεις να ξεσκονίσω τον VB6 κώδικά μου και να σου δείξω sample που φαίνεται ότι όταν τα data βρίσκονται client-side σέρνεται μια χαρά το grid της VB6. Επαναλαμβάνω, εκεί άνοιγες το recordset με τη default συμπεριφορά που είναι server-side cursor. Αυτό σημαίνει ότι τραβάει τα data λίγα-λίγα από τη βάση και δεν τα φέρνει όλα στον client, παρά μόνο όταν χρειάζεται, ενώ σου δίνει τη ψευδαίσθηση ότι τα έχεις πάρει όλα. Συνεπώς δεν είναι το ίδιο πράγμα με το σενάριο που έχεις τώρα. Αυτό μπορείς να το διαπιστώσεις εξάλλου αν στον VB6 κώδικα θέσεις το connection object σε Nothing, πράγμα που μπορείς να κάνεις άνετα στην περίπτωσή του .NET κώδικα χωρίς να υπάρξει πρόβλημα.


    Vir prudens non contra ventum mingit
  •  01-08-2008, 00:06 43853 σε απάντηση της 43852

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Ευχαριστώ ήσουν αρκετά κατατοπιστικός για την BindingSource.
    Επεγεργάζεσαι τα δεδομένα που έχεις ήδη εμφανίσει από τον SQL String.
    Παρατήρησα ότι στην δική μου περίπτωση, ναι μεν πετύχαμε την ταχύτητα μαζί με την ταξινόμηση των δεδομένων, αλλά αποτύχαμε στην ορθότητα των στοιχείων.

    Εξηγούμαι:
    Εμφανίζουμε 10 records από μία βάση που περιέχει περισσότερα (άρα εμφανίζουμε με την σειρα΄και όχι ταξινομημένα)
    Ταξινομούμε τα στοιχεία που εμφανίσαμε από την προηγούμενη πρόταση (γίνεται ταξινόμηση στα 10)
    Απότέλεσμα:
    Παίρνουμε μεν ταξινομημένα στοιχεία, αλλά όχι τα σωστά γιατί η ταξινόμηση εγινε από σύνολο 10 στοιχείων και όχι από το σύνολο των records.

    KelMan:

    Ως προς τη VΒ6 που επιμένεις, θα με κάνεις να ξεσκονίσω τον VB6 κώδικά μου και να σου δείξω sample που φαίνεται ότι όταν τα data βρίσκονται client-side σέρνεται μια χαρά το grid της VB6. Επαναλαμβάνω, εκεί άνοιγες το recordset με τη default συμπεριφορά που είναι server-side cursor. Αυτό σημαίνει ότι τραβάει τα data λίγα-λίγα από τη βάση και δεν τα φέρνει όλα στον client, παρά μόνο όταν χρειάζεται, ενώ σου δίνει τη ψευδαίσθηση ότι τα έχεις πάρει όλα. Συνεπώς δεν είναι το ίδιο πράγμα με το σενάριο που έχεις τώρα. Αυτό μπορείς να το διαπιστώσεις εξάλλου αν στον VB6 κώδικα θέσεις το connection object σε Nothing, πράγμα που μπορείς να κάνεις άνετα στην περίπτωσή του .NET κώδικα χωρίς να υπάρξει πρόβλημα.


    Συμφωνώ μαζί σου, αλλά μόνο για view αξίζει. Αυτό δεν γίνεται με το .ΝΕΤ;
  •  01-08-2008, 12:57 43862 σε απάντηση της 43853

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Ααα... αυτό με το TOP δεν είναι δική μου ευθύνη, είναι η συμβουλή του Γιώργου Big Smile

    To Virtual Mode είναι η ενδεικνυόμενη λύση στη περίπτωσή σου. Δεν ξέρω γιατί δεν σου δουλεύει, εγώ το έχω χρησιμοποιήσει αρκετές φορές. Μήπως δεν το υλοποίησες σωστά; Έχει ένα stiff learning curve αλλά θα γλύτωνες από το  να πειράζεις τον SQL κώδικά σου.


    Vir prudens non contra ventum mingit
  •  02-08-2008, 01:02 43891 σε απάντηση της 43862

    Απ: Ταχύτατη εμφάνιση Records στο DataGridView

    Η καθυστέρηση οφείλεται στην SQL String ή στο γέμισμα του DataGridView.
    Μπορώ να χρησιμοποιήσω άλλο εργαλείο για την εμφάνιση?
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems