|
Îåêßíçóå áðü ôï ìÝëïò Dataman. Τελευταία δημοσίευση από το μέλος Dataman στις 02-08-2008, 01:02. Υπάρχουν 12 απαντήσεις.
-
31-07-2008, 11:12
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Ταχύτατη εμφάνιση 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση Records στο DataGridView
KelMan:
Και πάλι δεν έχει ταχύτητα, το ίδιο είναι.
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
|
|
Απ: Ταχύτατη εμφάνιση 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.
|
|
-
31-07-2008, 20:24
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση Records στο DataGridView
George J. Capnias:- Δηλαδή πιστεύεις ότι αν είχες τον τρόπο να δείξεις πολύ γρήγορα ή και άμεσα 400000 γραμμές στο χρήστη, θα του ήταν χρήσιμες;
- Η αν ο χρήστης είχε 500000 γραμμές μπροστά του και πληκτρολογώντας χαρακτήρες, το πρόγραμμα μπορούσε να τον οδηγήσει άμεσα στην πρώτη εγγραφή που έκανε match το search θα ήταν ένα αποδεκτό interface;
Συμφωνώ απόλυτα ότι δεν ενδιαφέρει τον χρήστη να εμφανίζονται όλες οι εγγραφές αλλά θέλω να το χρησιμοποιήσω για συμβατότητα χειρισμού με την εφαρμογή που σχεδιάστηκε για την VB6 (με τον τρόπο που περιέγραψα πιο πάνω).
George J. Capnias:
- Να οριστεί στο πρόγραμμα ότι θα επιστρέφει μόνο, πχ, τις πρώτες 100 εγγραφές: Έτσι θα ξέρουμε ότι ο χρήστης δεν θα "μπουκώνει" από αυτά που θα εμφανίζονται μπροστά του, και εύκολα θα μπορεί να συμπεράνει αν έχει βρει αυτό που ζητάει.
Ακριβώς αυτό θα μπορούσε να εφαρμοστεί στην εφαρμογή. Μπορεί να γίνει αυτό από το Query?
(SQL).
|
|
-
31-07-2008, 21:16
|
|
Απ: Ταχύτατη εμφάνιση Records στο DataGridView
Dataman:Ακριβώς αυτό θα μπορούσε να εφαρμοστεί στην εφαρμογή. Μπορεί να γίνει αυτό από το Query? (SQL).
Ναι, μπορεί να γίνει με το ΤOP, δίνοντας μαζί, είτε τον αριθμό εγγραφών που θες να γυρίσει το SELECT, ή το ποστοστό επό των εγγραφών που θες να γυρίζει επί του συνόλου. Δες την σχετική βιβλιογραφεία στο MSDN Library.
George J.
|
|
-
31-07-2008, 22:13
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση 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
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: Ταχύτατη εμφάνιση Records στο DataGridView
Ααα... αυτό με το TOP δεν είναι δική μου ευθύνη, είναι η συμβουλή του Γιώργου 
To Virtual Mode είναι η ενδεικνυόμενη λύση στη περίπτωσή σου. Δεν ξέρω γιατί δεν σου δουλεύει, εγώ το έχω χρησιμοποιήσει αρκετές φορές. Μήπως δεν το υλοποίησες σωστά; Έχει ένα stiff learning curve αλλά θα γλύτωνες από το να πειράζεις τον SQL κώδικά σου.
Vir prudens non contra ventum mingit
|
|
-
02-08-2008, 01:02
|
-
Dataman
-
-
-
Μέλος από τις 19-12-2006
-
-
Δημοσιεύσεις 66
-
-
|
Απ: Ταχύτατη εμφάνιση Records στο DataGridView
Η καθυστέρηση οφείλεται στην SQL String ή στο γέμισμα του DataGridView. Μπορώ να χρησιμοποιήσω άλλο εργαλείο για την εμφάνιση?
|
|
|
|
|