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

 

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

Σύκριση στοιχείων πεδίου ΒΔ SQL με string

Îåêßíçóå áðü ôï ìÝëïò Matas. Τελευταία δημοσίευση από το μέλος beastie στις 25-01-2007, 13:57. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-01-2007, 10:45 24005

    Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Καλημέρα σας... Έψαχνα πολύ καιρό να βρω ένα φόρουμ που να συζητά τέτοια πράγματα,
    μιας και το βιβλίο που αγόρασα, το VB.NET, του Γκιούρδα νομίζω είναι, έχει απλά πολλές
    σελίδες και καμιά ουσία. Ολόκληρο βιβλίο, δεν είχε αναφορά στο πως κάνω εισαγωγή
    στοιχείων σε ΒΔ, παρά μόνο ανάσυρση δεδομένων!
    Με τα πολλά - με τα λίγα, ψάξιμο στο ίντερνετ, βρήκα τρόπο να βάζω αυτά τα
    datasets και να κάνω σύνδεση με τη ΒΔ, και να εισάγω στοιχεία..
    Τώρα μου προέκυψε άλλο πρόβλημα :


    -> Θέλω όταν βάζω το στοιχείο, το οποίο θα είναι κλειδί, πριν καταχωρηθεί στην βάση, να σαρώνονται οι
         εγγραφές του πεδίου κλειδιού της βάσης με το string το οποίο εισάγω, και το μήνυμα
         σφάλματος(διπλοεγγραφής), να πετάγεται από δικό μου MsgBox και όχι από μήνυμα της SQL or .NET
         - πώς λοιπόν θα κάνω function(είναι αυτό που λέει stored procedures??) για να καλώ λειτουργία με 
           ορίσματα τον πίνακα τον οποίο θέλω να σαρώσω, το πεδίο του και το string οποίο θέλω, για να την
           έχω για όλο το πρόγραμμα, μιας και θα χρειαστεί να την καλέσω πολλές φορές?
         - Εσείς που ασχολείστε περισσότερο καιρό, έχετε κάτι καλύτερο να μου προτείνετε?

    Σας ευχαριστώ

  •  25-01-2007, 11:49 24009 σε απάντηση της 24005

    Re: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Δεν ξέρω αν είμαι ο ειδικός, αλλα θα προσπαθήσω να πω 2-3 πράγματα.

    Αρχικά να μιλήσω για VB.Net (τα ίδια ισχύουν και στις άλλες γλώσσες)

    Αν θέλεις να δεις αν υπάρχει ήδη εγγραφή στον πίνακα μπορείς πριν το INSERT να κάνεις ένα SELECT ώστε να δεις αν υπάρχει η εγγραφή. Αυτό κατά την γνώμη μου ΔΕΝ είναι σωστό.

    1 Θα είναι πιο αργό να κάνεις 2 κινήσεις για κάθε εισαγωγή (1. το select και 2 to insert όταν δεν θα υπάρχει)

    2. Αν γράφουν περισσότερες εφαρμογές στον πίνακα, ποιος σου διασφαλίζει ότι μεταξύ του SELECT σου και μέχρι το INSERT κάποιος άλλος δεν έχει προλάβει να κάνει INSERT με αυτό το κλειδί??? (Στην περιπτωση αυτή πάλι θα λάβεις ERROR)

    Αυτό που μπορείς λοιπόν να κάνεις είναι στον κώδικα σου το INSERT να το έχεις μέσα σε ένα TRY..Catch ώστε να "πιάνεις" το λάθος του διπλού κλειδιού και να εμφανίζεις στον χρήστη δικό σου μήνυμα με to MSGBOX.

    Τώρα το Insert μπορείς και να το κάνεις με STORED PROCEDURE και όχι να γράφεις στον κώδικα σου (.net) το TSQL Statement...

    Αυτά απαντούν στο 1. Για το δεύτερο ναι καλό είναι να υπάρχει σε Function (της γλώσσας πάντα) που να κάνει λειτουργίες που εκτελούνται πολλές φορές μέσα στην εφαρμογή. Για τις FUnctions καλό είναι να περνάς τις πληροφορίες που θέλεις σαν παραμέτρους (να αποφύγεις Global μεταβλητές)

    Ελπίζω να βοήθησα έστω και λίγο.

    Αν κάποια δεν είναι κατανοητά (είτε γιατί δεν τα γνωρίζεις, είτε γιατί δεν τα είπα "λιανά") στην διάθεση σου για περισσότερα.

    Φιλικά,




    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  25-01-2007, 12:26 24014 σε απάντηση της 24009

    Απ: Re: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Επιπρόσθετα, είναι πολύ κακή πρακτική να αφήνεις τον χρήστη να ορίζει το κλειδί. Συνήθως το κλειδί είναι ένα πεδίο που παράγεται αυτόματα και εγγυάται η μηχανή της ΒΔ ότι θα είναι μοναδικό (πχ autoincrement ή guid).

    Αν για παράδειγμα έχεις έναν πίνακα με αυτοκίνητα, σαφώς ο αριθμός κυκλοφορίας είναι μοναδικός για κάθε αυτοκίνητο αλλά δεν θα τον ορίσεις ως κλειδί. Θα ορίσεις ένα autoincrement πεδίο ως CarID (ας πούμε) και στο πεδίο του αρ. κυκλοφορίας (TemplateNumber) που μπορεί ο χρήστης να εισάγει ό,τι θέλει, θα ορίσεις ένα unique constraint, δηλαδή έναν περιορισμό ότι οι τιμές θα πρέπει να είναι μοναδικές. Κατόπιν, μπορείς να εφαρμόσεις αυτά που λέει ο φίλος beastie, για το try...catch (που είναι ο καλύτερος τρόπος για έλεγχο και απόρριψη διπλοεγγραφών). To CarID ονομάζεται surrogate key σε αντίθεση με το TeplateNumber που ονομάζεται NaturalKey.

    Υπάρχει αρκετή θεωρία για τα πλεονεκτήματα που προσφέρει αυτή η σχεδίαση.
    Ρίξε μια ματιά εδώ: http://en.wikipedia.org/wiki/Surrogate_key#Advantages_of_Surrogate_Keys, εδώ
    http://www.agiledata.org/essays/keys.html και εδώ
    http://blogs.msdn.com/anthonybloesch/archive/2005/09/09/Surrogate-Keys.aspx


    Vir prudens non contra ventum mingit
  •  25-01-2007, 12:27 24015 σε απάντηση της 24005

    Απ: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Κάπως το αποφαφήνισες φίλε.. Ωραία! Θα το δοκιμάσω το βράδυ μετά την δουλειά και θα σου πω πως δουλεύει..
  •  25-01-2007, 12:38 24020 σε απάντηση της 24015

    Απ: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Λοιπόν, περιγραφή για να με καταλάβετε...

    Έχω πίνακα με στοιχεία ατόμων (οδηγοί μεταφορικής)..

    Η ταυτότητά τους ή ο αύξων αριθμός που θα μπει αυτόματα,

    δεν μπορούν να είναι μοναδικό κλειδί, γιατί οι οδηγοί μπορούν

    να απολυθούν και να επαναπροσληφθούν, οπότε θα

    πετάξει πρόβλημα διπλοεγγραφής όταν ξαναπροσληφθούν..

    Θέλω να βάλω δηλαδή και έναν αριθμό συμβολαίου,

    που θα είναι και αυτός αυτόματα αυξανόμενος...

    Μπορώ να βάλω 2 surrogate keys όπως ανέφερε ο KelMan?

    Ειλικρινά, δεν περίμενα τόσο άμεσες και κατατοπιστικές απαντήσεις,

    ευχαριστώ
  •  25-01-2007, 12:47 24021 σε απάντηση της 24020

    Re: Απ: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    Μπορείς σε ένα πίνακα να έχεις 2 πεδία που θα είναι Autoincrement και μπορεί και το κάθε ένα να είναι με διαφορετικό Starting Value αλλά και διαφορετικό Increment...

    Οσο για τον Αύξωντα αριθμό... Αν θέλεις πάντα να έχεις 1,2,3, για τους ενεργούς και πχ 0 για τους μη ενεργούς, σίγουρα δεν μπορεί να είναι κλειδί, αν όμως είναι Autoincrement τότε μπορείς να το έχεις για κλειδι...
    ΔΛΔ ένας υπάλληλος με ID 5 αν φύγει και μετά ξαναέρθει το νέο του ID θα είναι το επόμενο δυνατό... πχ 32

    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  25-01-2007, 13:47 24029 σε απάντηση της 24005

    Απ: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    ΟΚ, το 'πιασα... Βασικά χρειάζομαι ένα surrogate key και σαν συμπλήρωμα θα βάλω και τον αριθμό ταυτότητας ή το όνοματεπώνυμο του οδηγού, οπότε θα επιτρέπονται οι εγγραφές με τον ίδιοι αριθμό ταυτότητας και διαφορετικό

    "αύξοντα αριμό = αριθμός συμβολαίου"
  •  25-01-2007, 13:57 24031 σε απάντηση της 24029

    Re: Απ: Σύκριση στοιχείων πεδίου ΒΔ SQL με string

    αριθμό ταυτότητας ή το όνοματεπώνυμο του οδηγού

    Αυτά μπορούν κάλιστα να είναι 2 INDEX

    (1 για το κάθε ένα, γιατί κάθε φορά θα ψάχνεις είτε με το 1, είτε με το άλλο και έτσι ο SQL Server θα χρησιμοποιεί το καλυτερο)

    Προσοχή ο κάθε INDEX να μην είναι Unique values..

    Unique = false !!!
    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems