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

 

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

Έλεγχος διπλοεγγραφής

Îåêßíçóå áðü ôï ìÝëïò AngleV. Τελευταία δημοσίευση από το μέλος KelMan στις 30-11-2006, 14:45. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-11-2006, 11:22 21374

    Έλεγχος διπλοεγγραφής

    Έχουμε ένα SqlDatasource και ένα GridView

    Ένα DropDown έχει διάφορες Τιμές

    π.χ

    Value 1
    Value 2
    Value 3
    Value 4
    .....

    Επιλέγω το Value 1 και το καταχωρώ στην βάση με το InsertCommand του SqlDataSource.
    Πως μπορώ να ελέγξω τώρα με το SqlDataSource αν ο χρήστης πάει πάλι να καταχυρώσει το Value 1 και να τον ενημερώσει ότι υπάρχει ήδη στην βάση ;


     

  •  29-11-2006, 11:43 21376 σε απάντηση της 21374

    Απ: Έλεγχος διπλοεγγραφής

    θες απλά να τον ενημερώσεις και να αποφασίσει αν θέλει να κάνει την διπλοεγγραφή; ή να μην του το επιτρέψεις τελείως;
  •  29-11-2006, 11:49 21377 σε απάντηση της 21374

    Απ: Έλεγχος διπλοεγγραφής

    Ο έλεγχος πρέπει να γίνει σε δύο σημεία:
    • Την ώρα της αποθήκευσης στη βάση (υποχρεωτικό)
    • Στο user interface για να προειδοποιήσεις το χρήστη σου (προαιρετικό)
    Ο πιο απλός τρόπος να κάνεις το πρώτο, είναι να βάλεις έναν unique index ή ένα unique constraint πάνω στο εν λόγω πεδίο. Απλά θα πρέπει το κρυπτικό για το χρήστη μήνυμα λάθους που θα πάρεις από τη βάση να το μεταφράσεις σε κάτι πιο ανθρώπινο.

    Για το δεύτερο, μπορείς να κάνεις τον έλεγχο στο postback, που είναι σχεδόν ισοδύναμο με το να το κάνεις στη βάση (εκτός από την περίπτωση που τα data στο grid σου διαφέρουν από αυτά στη βάση), γιατί ο χρήστης τρώει το round trip. Επίσης μπορείς να το κάνεις client side με javascript.

    Μπορείς να συνδυάσεις και τα τρία, αλλά ο έλεγχος στη βάση είναι απαραίτητος.

    Νατάσα Μανουσοπούλου
  •  29-11-2006, 12:24 21378 σε απάντηση της 21377

    Απ: Έλεγχος διπλοεγγραφής

     mns wrote:
    Ο έλεγχος πρέπει να γίνει σε δύο σημεία:
    • Την ώρα της αποθήκευσης στη βάση (υποχρεωτικό)
    • Στο user interface για να προειδοποιήσεις το χρήστη σου (προαιρετικό)

    Ο πιο απλός τρόπος να κάνεις το πρώτο, είναι να βάλεις έναν unique index ή ένα unique constraint πάνω στο εν λόγω πεδίο. Απλά θα πρέπει το κρυπτικό για το χρήστη μήνυμα λάθους που θα πάρεις από τη βάση να το μεταφράσεις σε κάτι πιο ανθρώπινο.

    Για το δεύτερο, μπορείς να κάνεις τον έλεγχο στο postback, που είναι σχεδόν ισοδύναμο με το να το κάνεις στη βάση (εκτός από την περίπτωση που τα data στο grid σου διαφέρουν από αυτά στη βάση), γιατί ο χρήστης τρώει το round trip. Επίσης μπορείς να το κάνεις client side με javascript.

    Μπορείς να συνδυάσεις και τα τρία, αλλά ο έλεγχος στη βάση είναι απαραίτητος.

     

    Νατάσα αυτο που λές το έκανα
    Δες παρακάτω τον κώδικα

          

      Try
                DisplaykeysSqlDataSource.InsertParameters.Add("personID", Request.QueryString("ID"))
                DisplaykeysSqlDataSource.InsertParameters.Add("name", KeysDropDownList.Text)
                DisplaykeysSqlDataSource.Insert()
                KeysGridView.DataBind()

            Catch ex As Exception
               
                'Combilation Error
                'Violation of PRIMARY KEY constraint 'PK_tbl_mytable'. Cannot insert duplicate key in object 'tbl_mytable'.
                'The statement has been terminated.

                label1.text =  "Μίστερ η εγγραφή υπάρχει ήδη και δεν γίνεται να ξανά καταχωριθεί !!!!"
               
            End Try

     

    Είναι όμως σωστή πρακτική να χτυπάει Μήνυμα λάθους και μείς να το μεταφράζουμε σε απλούς χρήστες κατανοητό;
    θα πρέπει να ελέγξω την βάση για το αν η εγγραφή υπάρχει ήδη και κατόπιν να ενημερώσω τον χρήστη.
    Το θέμα είναι πως ;

     

  •  29-11-2006, 15:25 21396 σε απάντηση της 21378

    Απ: Έλεγχος διπλοεγγραφής

    Σϊγουρα πρέπει να κάνεις τον έλεγχο στη βάση, γιατί εκείνο είναι το μόνο σημείο όπου ο έλεγχος θα γίνει σωστά. Εσύ μπορείς να τον κάνεις στον κώδικά σου, αλλά από το σημείο του ελέγχου μέχρι να γίνει η εισαγωγή, μπορεί να σε προλάβει κάποιος άλλος. Αν θέλεις να ελέγξεις, να ενημερώσεις το χρήστη αν βρεις την εγγραφή, και αν δεν την βρεις να κάνεις την εισαγωγή με την ασφαλιστική δικλείδα του constraint, έχει καλώς.

    Επίσης είναι απαραίτητο τα μηνύματα που βλέπει ο χρήστης να είναι όσο πιό απλά και μη τεχνικά γίνεται. Αν θέλεις να έχεις κάπου διαθέσιμη και την τεχνική πληροφορία για να στη στείλει π.χ. με ένα e-mail, έχει καλώς, αλλά το κύριο μήνυμα πρέπει να είναι αρκετά απλό για να το καταλάβει ο πιο αδαής χρήστης.

    Νατάσα Μανουσοπούλου
  •  30-11-2006, 11:49 21444 σε απάντηση της 21374

    Απ: Έλεγχος διπλοεγγραφής

    Και πως κάνουμε έλεγχο στην βάση αν υπάρχει ήδη η εγγραφή,

    με την χρήση ενός SqlDataSource Control ;

  •  30-11-2006, 12:22 21448 σε απάντηση της 21444

    Απ: Έλεγχος διπλοεγγραφής

    Dim ConnString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LocalSqlServer").ToString
    Dim myConn As New Data.SqlClient.SqlConnection(ConnString)
    myConn.Open()
    Dim sqlString = "SELECT COUNT(*) FROM [myTable] WHERE ([Key1] =" + Request.QueryString("key1") + " AND key2=" + KeysDropDownList.Text + ")"

    Dim myCommand As New Data.SqlClient.SqlCommand(sqlString, myConn)

    Dim NumberOfRecords As Integer

    NumberOfRecords = myCommand.ExecuteScalar()

    myConn.Close()

    myConn = Nothing

    If NumberOfRecords = 0 Then

    'Η ΕΓΓΡΑΦΗ ΔΕΝ ΥΠΑΡΧΕΙ. ΑΣΕ ΤΟΝ ΧΡΗΣΤΗ ΝΑ ΤΗΝ ΚΑΤΑΧΩΡΗΣΕΙ

    else

    'η εγγραφή υπάρχει. Ενημέρωσε τον χρήστη ότι δεν μπορεί να την ξαναπεράσει

    end if

    Βέβαια μου φαίνεται οξύμωρο να έχουμε ήδη ενα open conection στην βάση με το SqlDatasource control και να ανοίγουμε και άλλο ένα  για να τσεκάρουμε αν υπάρχει ή όχι στην βάση η εγγραφή ;

     

     

  •  30-11-2006, 14:45 21462 σε απάντηση της 21448

    Απ: Έλεγχος διπλοεγγραφής

    Καλύτερα να κάνεις handle το exception. Αφ' ενός ο server δεν θα χρειάζεται να τρέξει όλα αυτά τα SELECT. Αφ' ετέρου, εφ' όσον πρόκειται για πολυχρηστική εφαρμογή, δεν υπάρχει καμία εγγύηση ότι από την στιγμή που έκανες το SELECT και είδες ότι δεν υπάρχει η εγγραφή, μέχρι τη στιγμή που κάνεις το  INSERT, δεν θα έχει προλάβει κάποιος τρίτος να κάνει το ίδιο INSERT.
    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems