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

 

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

Πρόβλημα Update σε μια Access βάση δεδομένων

Îåêßíçóå áðü ôï ìÝëïò tnikos. Τελευταία δημοσίευση από το μέλος Markos στις 23-12-2008, 16:48. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-11-2008, 16:29 46574

    Πρόβλημα Update σε μια Access βάση δεδομένων

    Αντιμετωπίζω τος εξής:

    Έχω ένα απλό πίνακα σε Access

    Area_ID (Key ID,AutoNumber)

    AreaName (String)

     Όταν κάνω Fill τα δεδομένα του πίνακα έρχονται στο DataSet, προσθέτω στον πίνακα μια εγγραφή και πέρνει το Area_ID την τιμή 1, πρίν κάνω Update από άλλη θέση εργασία ένα άλλος χρήστης Αποθηκευει στον ίδιο πίνακα και το Area_ID πέρνει την τιμή 1 στην βάση δεδομένων.

    Επιχειρώ να κάνω Update την δική μου εγγραφή, και την αποθηκεύει στο Δικό μου DataSet όμως αφού γίνει το Update το Area_ID παραμένει 1, δεν θα έπρεπε να έχει αλλάξει και να δείχνει 2 ?, διότι έαν κάνω Edit την εγγραφή μου, και ξαναπατήσω Update i geting an error, διότι στην βάση δεδομένων το ID έχει 2 και στο DataSet μου έχω 1.

     

    Ελπίζω να περιέγραψα το πρόβλημα σωστά, εάν έχει κάποιος αντιμετωπίσει το ίδιο πρόβλημα και έχει βρεί άκρη ας μου απαντήση.

  •  23-12-2008, 12:31 47103 σε απάντηση της 46574

    Απ: Πρόβλημα Update σε μια Access βάση δεδομένων

    Όταν έχεις auto increment πεδίο, αυξάνει μόνο όταν κάνεις insert, όχι update.
  •  23-12-2008, 16:48 47125 σε απάντηση της 46574

    Απ: Πρόβλημα Update σε μια Access βάση δεδομένων

    Συνημμένα: Area.zip

    Το thread αυτό το είχα ξεχάσει. Το ωραίο είναι ότι επειδή πρόκειται για Access είχα ετοιμάσει κι ένα solution - παράδειγμα για να το ανεβάσω. Το πρόβλημα συνοψίζεται στο πως να πάρεις το generated autonumber και να ενημερώσεις το dataset σου. Επίσης, αν και δεν το ξεκαθαρίζεις, πρέπει να έχεις χρησιμοποιήσει τον DataSet Designer, οπότε... έμπλεξες!

    Στο DNZ υπάρχουν threads που έχουν ασχοληθεί με το ίδιο πρόβλημα, όπως αυτό και αυτό. Θα σου συνιστούσα, όμως, να διαβάσεις πρώτα αυτό το άρθρο από το MSDN για να καταλάβεις μερικά πράγματα ως προς το μηχανισμό που υλοποιείται η όλη διαδικασία και μάλιστα στην Access. Η Access δεν επιτρέπει την εκτέλεση πολλαπλών statements και ούτε υποστηρίζει output parameters. Έτσι, ο μόνος τρόπος για να πάρεις την τιμή του autonumber είναι να εκτελέσεις ένα ξεχωριστό "SELECT @@IDENTITY statement" στο RowUpdated event του OleDBDataAdapter. Κι εδώ αρχίζουν τα δύσκολα, ειδικά στην περίπτωση που έχεις χρησιμοποιήσει τον dataset designer και άρα παίζεις με TableAdapter.

    Το πρώτο πράγμα που πρέπει να κάνεις είναι να αποκτήσεις πρόσβαση στον OleDBDataAdapter που είναι "κρυμμένος" μέσα στον TableAdapter. Για να το κάνεις αυτό θα πρέπει να βάλεις το χέρι στο πληκτρολόγιο και να ορίσεις ένα public property που θα σου επιστρέπει τον DataAdapter. Το πως γίνεται αυτό... στο συνημμένο.

    Αυτό είναι το πρώτο βήμα. Το δεύτερο είναι να εκτελέσεις σωστά το Select statement μέσα στο RowUpdated event. Το πρόβλημα εδώ είναι ότι για να λειτουργήσει το Select statement θα πρέπει να εκτελεστεί στο context του ιδίου connection. Αυτό σημαίνει ότι κατά το update θα πρέπει να πάρεις τον έλεγχο του connection. Πως γίνεται αυτό; Κοίτα συνημμένο.

    Το ερώτημα παρόλο που διατυπώνεται εύκολα και δημιουργεί την ψευδαίσθηση ότι είναι απλό, είναι πολύ σύνθετο, ιδιαίτερα αν "εμπλουτιστεί" με hierarchies και transactions. Δυστυχώς, δεν έχω τη διάθεση να γράψω ένα ολόκληρο κεφάλαιο και να το κάνω post. Το έχει ήδη κάνει η Microsoft στο link που σου έδωσα. Αν μελετήσεις τον κώδικα του παραδείγματος, ο οποίος πιστεύω ότι έχει αρκετά καλά σχόλια, τότε διατύπωσε συγκεκριμένες ερωτήσεις.

    Οπωσδήποτε μελέτησε το παράδειγμα του MSDN (τρίτη φορά). Είναι βασικό να καταλάβεις πως λειτουργεί το ADO.NET. Επίσης, κοίταξε λίγο το AutoIncrementSeed και το AutoIncrementStep. Η εμφάνιση του AutoNumber στο χρήστη πριν αποσταλεί στη βάση και πάρει την τελική του τιμή, είναι κακή πρακτική. Αν παίρνει θετικές τιμές, ο χρήστης μπορεί να θεωρήσεις ότι πρόκειται τον κανονικό κωδικό της εγγραφής. Για το λόγο αυτό, οι προσωρινές τιμές που εμφανίζονται πρέπει να είναι αρνητικές. Μελέτησε το παράδειγμα και τα ξαναλέμε.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems