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

 

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

Adding a new row

Îåêßíçóå áðü ôï ìÝëïò rama. Τελευταία δημοσίευση από το μέλος rama στις 04-10-2006, 01:29. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-09-2006, 22:18 16877

    Adding a new row

    Επιχειρώ να φτιάξω ένα control με το οποίο να διαβαζω τα columns από ένα datatable και να δημιουργώ τα αντίστοιχα πεδία για να κάνει εισαγωγή ο χρήστης δυναμικά (το σχέδιο είναι προφανώς πολύ τραβηγμένο). Για να γεμίζω τις τιμές των πεδίων και να παρω τις νεες τιμες για insert και update χρησιμοποιώ τους binding μηχανισμούς του .NET. Το προβλημα που έχει παρουσιαστεί έχει να κάνει με το insert. Μπορώ να κάνω ένα insert κανονικά χωρίς προβληματα. Όταν επιχειρώ να κάνω το δεύτερο παίρνω error :"This row already belongs to this table". Οι εντολές που εκτελώ για να γίνει ένα insert είναι οι παρακάτω:

    ((DataRowView)bs.AddNew()).Row; //(c#) όπου bs = BindingSource.
    // Μεσολαβεί η καταxώριση των στοιχείων. Tο binding έχει γίνει νωρίτερα και δεν αλλάζει για όσο "ζει" το control
    row.Table.Rows.Add(row);
    adapter.Update(row.Table.DataSet, this.tableName);   (οκ όχι ότι πιο κομψό!)

    Την δεύτερη φορά που πάω να κάνω update η εφαρμογή σκάει στην πρώτη εντολή.


  •  18-09-2006, 23:43 16881 σε απάντηση της 16877

    Απ: Adding a new row

    Μήπως το primary key σου δεν είναι identity για να παίρνει μόνο του νούμερα και ο adapter προσπαθεί να χώσει κάθε φορά στη βάση row με το ίδιο ID; Δες το schema του πίνακα ξανά και αν δεν βρεις κάτι, δοκίμασε να σουτάρεις και να ξαναφτιάξεις τον adapter μήπως δεν έχει πιάσει σωστά το πεδίο.

    Χρήστος Γεωργακόπουλος
  •  18-09-2006, 23:56 16882 σε απάντηση της 16881

    Απ: Adding a new row

    Μα αν ήταν έτσι δεν θα είχα πρόβλημα από το πρώτο Insert?

    Στην βάση έχω δηλώσει το primary key μου και το έχω βάλει και autoincrement. Χρειάζεται να κάνω κάτι και στο DataSet?

    Βασικά ότι χρησιμοποιώ το φτιάχνω με κώδικα (πχ τον adapter) και τα update queries του τα δημιουργώ (προς το παρών) με CommandBuilder. Το πρόβλημα που αναφέρω παρουσιάζεται με DataTable που γεμίζω με ένα απλό select * σε ένα πίνακα.
  •  19-09-2006, 01:07 16884 σε απάντηση της 16882

    Απ: Adding a new row

    Μήπως να μας ανέβαζες ένα projectάκι; Ομολογώ ότι δεν έχω πολυκαταλάβει πως προσπαθείς να κάνεις αυτό που κάνεις...
    Vir prudens non contra ventum mingit
  •  19-09-2006, 06:51 16885 σε απάντηση της 16882

    Απ: Adding a new row

    Κάτι ξεχνάς να φτιάξεις. Δοκίμασε να τα φτιάξεις όλα από τον designer (drag'n drop από τη βάση, generate dataset κλπ.) και δες τον κώδικα που βγάζει.

    Χρήστος Γεωργακόπουλος
  •  19-09-2006, 16:00 16927 σε απάντηση της 16885

    Απ: Adding a new row

    Υποπτεύομαι οτι τη δεύτερη φορά, το row το οποίο σου γυρίζει - για κάποιο λόγο - το ((DataRowView)bs.AddNew()).Row; είναι ένα υπάρχον row, και σου σκάει το Rows.Add(...). Αυτά απο το exception που σου σκάει, το "This row already belongs to this table".

    Αυτό βέβαια είναι λίγο παράξενο, και σίγουρα κάπου κάτι κάνεις λάθος, αλλά είναι πολύ δύσκολο να μαντέψει κάποιος απο το λίγο κώδικα που μας έδειξες ...
    Angel
    O:]
  •  19-09-2006, 17:35 16931 σε απάντηση της 16927

    Απ: Adding a new row

    Να επιμείνω και εγώ για ένα projectάκι.

    Ένα «project» 1000 λέξεις Smile
    while (!dead) learn();
  •  20-09-2006, 22:47 16994 σε απάντηση της 16931

    Απ: Adding a new row

    Συνημμένα: DataBoundCRUD.rar
    Λοιπόν έφτιαξα ένα project. Κατ'αρχην μην φρικάρετε με αυτά που θα δείτε για δύο λόγους:

    α) Δεν είμαι guru

    b) O αντίστοιχος κώδικας που χρησιμοποιώ εγώ είναι σπασμένος σε 4-5 classes. Για αυτό το λόγο σε μερικά σημεία χρησιμοποιώ ταρζανιές όπως πχ:

    row.Table.DataSet στην

    adapter.Update(row.Table.DataSet, this.tableName);

    αφού στη μέθοδο που κάνει τελικά το update παιρνάω το row.Table.Dataset. Υποθέτω οτι δεν παίζει ρόλο πάντως.

    Το project είναι σε C# για VS 2005 (χρησιμοποιώ το express). Ακόμα ξέρω οτι ο CommandBuilder δεν είναι οτι καλύτερο αλλά αυτό είναι κάτι που θα αλλάξω στην πορεία. Προς το παρών πάω για τα απλα πράγματα.

    Η βάση μου είναι σε MySQL και ο πίνακας Schools έχει σαν πρώτη κολώνα το id (το οποίο δεν συμπληρώνεται στην εισαγωγή γιατί είναι auto increment και θα γίνει readonly). To δεύτερο πεδίο είναι ένα πεδίο varchar. Τα ονόματα των πεδίων προφανώς δεν έχουν σημασία.

    Για να αναπαράγετε το πρόβλημα αφού ανοίξει η εφαρμογή και κάνει το select θα φέρει οτι υπάρχει στον πίνακα. Στην συνέχεια πατήστε Add, γράψτε κάτι στο 2ο txtBox και μετά πατήστε commit. Να πω εδώ οτι δεν με ενδιαφέρει να κάνω εισαγωγή στοιχείων από το grid και γενικά δεν χρησιμοποιώ τα controls για datasets, bindingsources κτλ

    Δεν βρήκα πως να ανεβάσω αρχείο οπότε το έβαλα στο rapidshare http://rapidshare.de/files/33838990/DataBoundCRUD.rar.html

    PS: Το βρήκα το συνημένο ... περασμένη η ώρα ...

  •  25-09-2006, 21:00 17166 σε απάντηση της 16877

    Απ: Adding a new row

    Κανείς?
  •  25-09-2006, 21:25 17172 σε απάντηση της 17166

    Απ: Adding a new row

    Έτσι όπως δείχνεις τον κώδικα, φαίνεται ότι όντως προσθέτεις δύο φορές το Row, μία φορά στο button1 και μία στο button2. Από τη στιγμή που το bindingsource συνδέεται ήδη με το DataTable, το bs.AddNew() έχει ήδη προσθέσει το Row στο DataTable. Όταν καλείς μετά την row.Table.Rows.Add(row), ξαναπροσθέτεις την ήδη υπάρχουσα γραμμή.

    Πάντως, ο κώδικας είναι πολύ μπλεγμένος. Δεν υπάρχει λόγος να προσθέτεις γραμμές μέσω του BindningSource ή να πειράζεις με το χέρι το BindingManagerBase. Αν προσθέσεις απευθείς το row στο datatable, θα πετύχεις το ίδιο
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-09-2006, 22:50 17185 σε απάντηση της 17172

    Απ: Adding a new row

    O pkanavos έχει δίκιο.

    Η λύση είναι να καλέσεις της EndEdit μέθοδο του Binding Source. Αν πρόκειται για νέα εγγραφή θα προστεθέι άπό το Binding Source στο Dataset αν υπάρχει ήδη τότε θα περάσει τις αλλαγές στο Dataset στην συγκεκριμένη εγγραφή με την οποία δούλευες.
  •  04-10-2006, 01:29 17884 σε απάντηση της 16877

    Απ: Adding a new row

    Τα κατάφερα! Τώρα για το θέμα της απλοποίησης του κώδικα, το project που ανέβασα είναι εντελώς flat... όταν φτιάξω κάτι λειτουργικό θα ανεβάσω κώδικα να δείτε πως το έχω "σπάσει" σε UI, Business και Data Access κομμάτια. Νομίζω οτι δεν γίνεται αλλιώς.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems