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

 

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

VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

Îåêßíçóå áðü ôï ìÝëïò epp1123. Τελευταία δημοσίευση από το μέλος tasos στις 08-09-2009, 09:44. Υπάρχουν 17 απαντήσεις.
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-09-2009, 02:40 53504

    VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Χαίρετε συνάνθρωποι, αναζητητώ τη βοήθεια σας. Έχω μία βάση σε mdb αρχείο. Συνδέομαι επάνω της με vb.net κώδικα (OLEDB) και επιχειρώ να πάρω 10 τυχαίες εγγραφές χρησιμοποιώντας την rnd(). Βάζω και σαν όρισμα την id στήλη (τύπου int με τιμές 1,2,3,4,5...) αλλά κάθε φορά που το τρέχω παίρνω τα ίδια αποτελέσματα. Στο google δε βρήκα τίποτα, και γενικά όσο και να έψαξα. 

    Any ideas???
  •  07-09-2009, 08:28 53505 σε απάντηση της 53504

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Αν και δουλεύει, μην χρησιμοποιείς την Rnd() αλλά την κλάση Random. Η Rnd() έχει μείνει για λόγους συμβατότητας με τη VB6. Τώρα, συνήθως οι γεννήτριες ψευδοτυχαίων αριθμών έχουν αυτό το πρόβλημα που αναφέρεις, ότι παράγουν τους ίδιους αριθμούς (και γι αυτό λέγονται "γεννήτριες ψευδοτυχαίων") και για να το λύσουν μπορούν να πάρουν έναν αρχικό αριθμό (seed) ο οποίος αλλάζει τη σειρά των ψευδοτυχαίων αριθμών που επιστρέφουν. Με αυτόν τον τρόπο έχουμε την ψευδαίσθηση ότι παράγονται τυχαίοι αριθμοί. Δες εδώ για περισσότερα http://msdn.microsoft.com/en-us/library/ctssatww.aspx


    Vir prudens non contra ventum mingit
  •  07-09-2009, 13:18 53508 σε απάντηση της 53505

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Η rnd() είναι της SQL που διαβάζει και ξέρει η Access, και άμα τρέξω το ερώτημα μέσα από την Access κάθε φορά μου επιστρέφει διαφορετικά αποτελέσματα. Τώρα αν είναι η ίδια από τα κατάλοιπα της VB δε το ξέρω.

    Το sql ερώτημα μου είναι έτσι "SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion)". Αν στη θέση του AQuestion βάλω 5 πχ δε μου επιστρέφει 10 εγγραφές αλλά και τις 100 που είναι μες τον πίνακα.  Θέλω τις 10 τυχαίες να τις πάρω μέσα από το sql ερώτημα μία και έξω.
  •  07-09-2009, 14:25 53510 σε απάντηση της 53508

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Βασικά είναι λάθος το query σου. Εσύ του ζητάς να σορτάρεις (order by)  βάση μιας στηλης που ουσιαστικά δεν υπάρχει rnd(AQuestion)

    Αυτό που χρειάζεσαι είναι να δημιουργήσεις ενα where με τυχαία ID's (φανταζομαι) των ερωτήσεων

    Γιώργος Σακαλής
  •  07-09-2009, 14:28 53511 σε απάντηση της 53510

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Η στήλη υπάρχει μια χαρά, είναι η ID στήλη, απλά το όνομα είναι αυτό AQuestion.
  •  07-09-2009, 14:51 53513 σε απάντηση της 53511

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Μαλλον δεν υπήρξα κατανοητός.

    Αυτό που γραφείς είναι SELECT TOP 10 * FROM Table1 ORDER BY x 

    όπου x ενας τυχαίος αριθμός όπου δημιουργεί η rnd. Δηλαδή λες φέρε μού όλα τα στοιχεία από τον πίνακα table1 και ταξινόμησε τα με τη سστήλη x η οποία δεν υπάρχει και όλας. Αυτό που προσπαθώ να σου πω είναι λάθος το query που έχεις. εσύ χρειάζεσαι κάτι του

    select * from table1 where id in (x1,x2,x3,x4,x5) όπου xi είναι τυχαία id's που έχεις ήδη δημιουργήσει

    Γιώργος Σακαλής
  •  07-09-2009, 15:24 53514 σε απάντηση της 53508

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    epp1123:
    Η rnd() είναι της SQL που διαβάζει και ξέρει η Access, και άμα τρέξω το ερώτημα μέσα από την Access κάθε φορά μου επιστρέφει διαφορετικά αποτελέσματα. Τώρα αν είναι η ίδια από τα κατάλοιπα της VB δε το ξέρω.

    Το sql ερώτημα μου είναι έτσι "SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion)". Αν στη θέση του AQuestion βάλω 5 πχ δε μου επιστρέφει 10 εγγραφές αλλά και τις 100 που είναι μες τον πίνακα.  Θέλω τις 10 τυχαίες να τις πάρω μέσα από το sql ερώτημα μία και έξω.

    Δοκίμασα σε μία βδ στην Access το ερώτημα "SELECT TOP 10 * FROM myTable ORDER BY rnd(myKey)" και παίρνω 10 αποτελέσματα και κάθε φορά είναι διαφορετικά. Αν τρέξεις το ίδιο ερώτημα κατευθείαν στην Access έχεις πάλι τις ίδιες εγγραφές σε κάθε εκτέλεση;

    Δεν κατάλαβα αυτό που λες "Αν στη θέση του AQuestion βάλω 5 πχ". Αν θέλεις 5 αντί για 10 αποτελέσματα γιατί να μην αλλάξεις το ερώτημα σε "SELECT TOP 5 ...". Μήπως εννοείς κάτι άλλο;


    Τάσος Καραγιάννης

    Baby debugging steps...
  •  07-09-2009, 15:33 53516 σε απάντηση της 53514

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Μέσα στην Access δουλεύει το  "SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion)" όπως δούλεψε σε εσένα. Μέσα από κώδικα, είτε είναι VB.NET, είτε Java (το έτρεξα και εκεί) μου επιστρέφει τα ίδια. Στη πρόταση μου αν αλλάξω το AQuestion με 5 εννοώ αυτό --> "SELECT TOP 10 * FROM Table1 ORDER BY rnd(5)". Τότε όμως μου επιστρέφει και τις 100 εγγραφές της βάσης, όχι τις 10 που δηλώνω στο TOP 10
  •  07-09-2009, 15:47 53520 σε απάντηση της 53516

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Καλά κατάλαβα λοιπόν, στο rnd() όμως δεν πρέπει να βάλεις το όνομα του πεδίου; Μάλλον έβαλες το 5 σαν seed στον random generator. 

    Δοκίμασε να σώσεις σαν query το "SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion)" και από κώδικα να καλείς την query αυτή. Ίσως έτσι να καταφέρεις να πάρεις τα data όπως θέλεις.


    Τάσος Καραγιάννης

    Baby debugging steps...
  •  07-09-2009, 15:48 53522 σε απάντηση της 53520

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    το έχω κάνει ήδη. τίποτααααααααααααααααααααααααααααα
  •  07-09-2009, 16:10 53526 σε απάντηση της 53522

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Το πρόβλημα σου είναι αλλού!

    Η Access έχει ένα πρόβλημα με το TOP και το ORDER BY. Δηλαδή, αν το πεδίο στο ORDER BY δεν είναι μοναδικό, τότε η access δεν εκτελεί το TOP 5 και σου επιστρέφει όλες τις εγγραφές. Για παράδειγμα, αν έχεις ένα πεδίο field1 και όλες οι εγγραφές έχουν τη τιμή '4' στο πεδίο αυτό, τότε η ερώτηση "SELECT TOP 5 * FROM myTable ORDER BY field1" δεν θα σου επιστρέψει 5 εγγραφές αλλά όλο το πίνακα!!!! 

    Όταν εσύ κάνεις ORDER BY rnd(5), επειδή το rnd(5) είναι η ίδια τιμή ισχύει το bug που σου περιέγραψα και για αυτό παίρνεις όλες τις εγγραφές. Για να το λύσω έκανα order by στα πεδία που ήθελα αλλά πρόσθετα και το primary key στο τέλος, και έτσι έπαιζε σωστά. 

    Όμως δοκίμασα το "SELECT TOP 5 * FROM myTable ORDER BY rnd(5), myKey" αλλά δεν έπαιξε. Sad

    Δεν έχω κάποια λύση να σου προτείνω ακόμα, αν σκεφτώ κάτι θα το ποστάρω.



    Τάσος Καραγιάννης

    Baby debugging steps...
  •  07-09-2009, 16:15 53529 σε απάντηση της 53526

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Αααα μάλιστα. Αυτό δε το ήξερα. Έμαθα και κάτι σήμερα. Ευχαριστώ. Το rnd(5) δε το θέλω. Το δοκίμασα καθαρά ακαδημαικά.
  •  07-09-2009, 16:22 53530 σε απάντηση της 53522

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Ψυχραιμία!

    Ας τα πάρουμε τα πράγματα από την αρχή. Λοιπόν, αυτό που προσπαθείς να κάνεις δεν θα παίξει. Το αποτέλεσμα του ORDER BY rnd(x) θα είναι να βγάλει μια φορά έναν τυχαίο αριθμό και να τον θεωρήσει αυτόν ως τη στήλη, βάσει της οποίας θα κάνει το ORDER BY. Γι αυτόν το λόγο φαίνεται σαν να επιλέγονται τυχαίες εγγραφές πράγμα που δεν συμβαίνει στην πράξη. Το SELECT TOP 10 * FROM Table1 ORDER BY rnd(AQuestion) μπορεί να συνεπάγεται SELECT TOP 10 * FROM Table1 ORDER BY 1 ή SELECT TOP 10 * FROM Table1 ORDER BY 2  δηλαδή, ταξινόμηση κατά το πρώτο πεδίο ή το δεύτερο, κοκ. Αν στην πρώτη στήλη έχει ένα ID θα ταξινομήσει σε αύξουσα σειρά τους αριθμούς και θα πάρει τις 10 πρώτες εγγραφές. Αν στην δεύτερη έχει επίθετα, θα ταξινομήσει τα ονόματα και θα πάρει τις 10 πρώτες εγγραφές, αν στην τρίτη έχει ημερομηνίες, θα ταξινομήσει βάσει των ημερομηνιών και θα πάρει πάλι τις 10 πρώτες εγγραφές. Ωστόσο πάντοτε το SELECT TOP 10 * FROM Table1 ORDER BY 2 θα φέρνει τις ίδιες 10 πρώτες εγγραφές εκτός βέβαια αν στο μεταξύ κάνεις κάποιο insert/update/delete που αλλάζει τη σειρά.

    Τώρα, μιας και είσαι άτυχος και δουλεύεις στην Access που αν δεν κάνω λάθος, δεν έχει guid function, μια απλή λύση είναι να κάνεις τα παρακάτω μέσα από τη VB:

    1. Με ένα query να πάρεις το πλήθος των εγγραφών του πίνακα, έστω Χ
    2. Να παράγεις όσους τυχαίους αριθμούς χρειάζεσαι από τιμή 1 ως Χ
    3. Με ένα DataReader να διαβάσεις σε loop τις εγγραφές και χρησιμοποιώντας έναν counter, όταν η τιμή του counter γίνεται ένας από τις τιμές που έβγαλες στο #2, να κρατάς την εγγραφή, αλλιώς να προχωράς στην επόμενη.

    Υπάρχουν και άλλες τεχνικές που κινιούνται σε αυτήν τη φιλοσοφία, όπως πχ να κάνεις generate τυχαία κλειδιά (ειδικά αν το κλειδί είναι ένας ακέραιος αριθμός) και να τραβάς μία εγγραφή βάσει του τυχαίου κλειδιού. Όπως και να έχει απλά θα πρέπει να κρατάς τα τυχαία νούμερα που έχουν ήδη "βγει" σε κάποιο array και να ελέγχεις ότι ένα νέο τυχαίο νούμερο δεν βρίσκεται ήδη μέσα σε αυτό το array.

     


    Vir prudens non contra ventum mingit
  •  07-09-2009, 17:31 53534 σε απάντηση της 53530

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Συνημμένα: test_top_orderby.zip
    KelMan:

    Ψυχραιμία!

    ... Ωστόσο πάντοτε το SELECT TOP 10 * FROM Table1 ORDER BY 2 θα φέρνει τις ίδιες 10 πρώτες εγγραφές εκτός βέβαια αν στο μεταξύ κάνεις κάποιο insert/update/delete που αλλάζει τη σειρά... 

    Αυτό που είπα είναι ότι αν το δεύτερο πεδίο του πίνακα έχει πάντα την ίδια τιμή, τότε το ερώτημα "SELECT TOP 10 * FROM Table1 ORDER BY 2" δεν θα φέρει 10 εγγραφές αλλά όλο τον πίνακα. Και αυτό συμβαίνει στον φίλο epp1123 γιατί η rnd(5) είναι πάντα η ίδια τιμή. 

    Επισυνάπτω μία μικρή access και δείτε ότι όντως συμβαίνει αυτό. Υπάρχουν 31 εγγραφές και το field1 έχει παντού τη τιμή 'w'. το "SELECT TOP 10 * FROM Table1 ORDER BY 2" θα φέρει όλο το πίνακα.

    Εκτός κι αν κάνω κάτι τραγικά λάθος...


    Τάσος Καραγιάννης

    Baby debugging steps...
  •  07-09-2009, 17:53 53535 σε απάντηση της 53534

    Απ: VB.NET, σύνδεση σε βάση Microsoft Access και επιλογή τυχαίων εγγραφών.

    Το έφτιαξα. Σας ευχαριστώ όλους.
Σελίδα 1 από 2 (18 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems