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

 

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

Χρησιμοποιώντας το αγέννητο id....

Îåêßíçóå áðü ôï ìÝëïò epp1123. Τελευταία δημοσίευση από το μέλος Adamantios στις 05-06-2008, 11:00. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  04-06-2008, 11:14 42618

    Χρησιμοποιώντας το αγέννητο id....

    Καταρχάς καλημέρα. Εν δευτέροις η ιστορία μου έχει ως εξής:

    Έχω ένα πίνακα που ονομάζεται News. Στην αρχική σελίδα, εμφανίζεται το NewsDate πεδίο, το  NewsTitle πεδίο, το Description (ουσιαστικά μία μικρή περίληψη της συνολικής είδησης) πεδίο, και έχω βάλει σε ένα <asp:hyperlink>  όπου στο naviagateURL έχει πάει  το  πεδίο  more,  με τη λογική του διαβάστε περισσότερα. Το  πεδίο  more  είναι ένα πεδίο κειμένου το οποίο εμπεριέχει εγγραφές σαν την παρακάτω για παράδειγμα "NewsAnalytika.aspx?id=1", όπου id, το id της είδησης.

    Α, να τονίσω, πως το το id στον πίνακα αυτόν, αυξάνεται μόνο του αυτόματα.

    Η απορία που γενάται στο μυαλό μου είναι η εξής:

    Όταν θέλω να εισάγω μία νέα εγγραφή, πως θα καταφέρω να πάρω το νέο id, και να το σώσω στο πεδίο more, μιας και το id εκείνη την ώρα θα δημιουργηθεί;

    Μία σκέψη που έκανα ήταν να αποθηκεύσω την εγγραφή, χωρίς να βάλω τιμή στο πεδίο more, και επιτόπου να κάνω select το id και ύστερα αφού επιστρέψω στην τελευταία εγγραφή, να αποθηκεύσω τα δεδομένα που θέλω στο πεδίο more. Αυτό όμως γίνεται πιο απλά ή όχι;;;

    Απορία ν 2, εύκολη όμως

    Το πεδίο NewsDate είναι τύπου datetime και έχω βάλει στο Default Value or Binding τη συνάρτηση getdate() για να αποθηκεύει την τωρινή ημερομηνία. Η απορία μου έχει να κάνει με το γεγονός, αν πρέπει μέσα στο update και insert sql query να γράφω και NewsDate = getdate(), δεν χρειάζεται, γίνεται από μόνο του



  •  04-06-2008, 11:31 42619 σε απάντηση της 42618

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Εγώ αυτό που θα έκανα είναι πριν το Insert στον πίνακα θα έκανα select το Max value της κολώνας id και θα το αύξανα κατά 1.


    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  04-06-2008, 11:50 42620 σε απάντηση της 42619

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Σωστό, ευχαριστώ. Θα το κοιτάξω και αυτό. Απλά σκεφτόμουν μήπως γίνεται με άλλο τρόπο χωρίς να χρειαστείς να χρησιμοποιήσεις δεύτερο sql ερώτημα, και γενικά είσαι μπρος πίσω με τις εγγραφές, αλλά από ότι φαίνεται μάλλον έτσι γίνεται.
  •  04-06-2008, 12:19 42621 σε απάντηση της 42620

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Δεν είναι κι ότι πιο σωστό ο τρόπος, καθώς έτσι εάν κάποιος άλλος κάνει καταχώρηση στο πίνακα News πριν απο εσένα (κι αφού εσύ διάβασες την τιμή) το id που έχεις πάρει θα είναι λαθος. Δεν μας λες και τι βάση έχεις αλλα εγώ προτείνω:

    1) Μια stored procedure η οποία κάνει την καταχώρηση στον πίνακα News αφού κάνει generate το id με newid() οπότε θα ξέρεις πάντα πια είναι η σωστή τιμή.

    2) Εαν χρησιμοποιείς sql server 2005 θα μπορούσες να χρησιμοποιήσεις το keyword OUTPUT ώστε να πάρεις την τιμή του id μετά το insert και να είσαι σίγουρος ότι θα είναι σωστό. πχ INSERT INTO news(field1, field2) OUTPUT INSERTED.ID Values(N'val1',N'val2'); Στην συνέχεια μπορείς απλά να εκτελέσεις ενα update ώστε να ενημερώσεις την εγγραφή. Προσωπικά πάντως θα έκανα το πρώτο εκτός εαν δεν είχα την δυνατότητα να κάνω διαφορετικά.


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  04-06-2008, 12:23 42622 σε απάντηση της 42620

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Ο σωστός τρόπος είναι να χρησιμοποιήσεις το @@IDENTITY για να πάρεις το last created index σε ενα autoincrement πεδίο.

    Μπορείς να δείς αναλυτικά http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

    για το τι γίνεται με τα sessions και τα scope, ώστε να είσαι σίγουρος ότι ανήκει στο δικό σου transaction και όχι σε κάποιον άλλο


    Γιώργος Σακαλής
  •  04-06-2008, 12:28 42623 σε απάντηση της 42621

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Έχει δίκιο ο Παναγιώτης.  Ο τρόπος που πρότεινα δεν είναι και ο πιο σωστός.
    Νομίζω ότι πρώτος τρόπος είναι ο καλύτερος.


    Φιλάρετος Σεβαστιάδης.

    Albert Camus: Life is the sum of your choices.

  •  04-06-2008, 12:37 42625 σε απάντηση της 42623

    Απ: Χρησιμοποιώντας το αγέννητο id....

    Καταρχάς ευχαριστώ και πάλι. Η βάση MS SQL 2005. Τελικά το έφτιαξα με τελείως διαφορετικό τρόπο, μιας και η παρουσία πεδίου more τελικά δεν ήταν απαραίτητη. Βέβαια ότι πληροφορία μου δώσατε, είναι ανεκτίμητη, δε αυτό με το output μπορώ να πω ότι έδωσε ρέστα.

    Καταρχάς να πω ότι το control που χρησιμοποιώ (και μήλον της έριδος στην περίπτωση μας) είναι το Latest News από την Dev Express. Το control αυτό είχε ένα property που ονομαζεται NavigateUrlField, και εγώ ο ψαρωμένος νόμιζα ότι έπρεπε να έχω πεδίο στη βάση, όπου να έχει μέσα του το url. Τελικά η λύση βρέθηκε, μιας και υπήρχε το property NavigateUrlStringFormat και τελικά αυτό που έγραψα ήταν το εξής

    NavigateUrlStringFormat = "NewsAnalytica.aspx?id={0}" και NavigateUrlField="id", όποτε εν τέλη έπαιρνα το NewsAnalytica.aspx?id=1,2,3 κτλ.


  •  05-06-2008, 11:00 42664 σε απάντηση της 42622

    Απ: Χρησιμοποιώντας το αγέννητο id....

    sakalis:

    Ο σωστός τρόπος είναι να χρησιμοποιήσεις το @@IDENTITY για να πάρεις το last created index σε ενα autoincrement πεδίο.

    Μπορείς να δείς αναλυτικά http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

    για το τι γίνεται με τα sessions και τα scope, ώστε να είσαι σίγουρος ότι ανήκει στο δικό σου transaction και όχι σε κάποιον άλλο



    Εγώ συνήθως ακουλουθώ την εξής λογική: strsql = "insert into mpla_mpla (col1, col2) values (@par1, @par2); SELECT CAST(scope_identity() AS int) as Ident"  και στην συνέχεια χρησιμοποιώ την ExecuteScalar για να πάρω την τιμή που θέλω.... Δεν ξέρω αν είναι ο καλύτερος τρόπος, αλλά μέχρι στιγμής με έχει βολέψει αρκετά......

    Διαμάντης

    A wise man does not urinate against the wind Smile
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems