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

 

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

Update σε εγγραφη μεσω textBox σε WinForm

Îåêßíçóå áðü ôï ìÝëïò kos6101991. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 21-05-2012, 12:43. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  20-05-2012, 13:37 70280

    Update σε εγγραφη μεσω textBox σε WinForm

    Παιδια καλησπερα ο κωδικας ειναι ο εξης :

    textBox1.Text=z; 
    SqlConnection x = new SqlConnection(); 
    SqlCommand y = new SqlCommand(); 
    x.ConnectionString=@"Data Source=KOSTAS-PC;Initial Catalog=form;Integrated Security=True";
    y.Connection = x; 
    y.CommandText = ("update krithrio1 set y=0.6 where x=25"); 
    x.Open(); 
    y.ExecuteNonQuery(); 
    x.Close(); 
    new Form2().Show();

    Το προβλημα ειναι οτι θελω στη θεση του y=0.6 να ειναι y=z αλλα αυτο μου βγαζει error δηλ. θελω η τιμη που μπαινει στο textBox να μπαινει στη βαση αλλα δεν ξερω πως αυτο να το μεταφερω στην εντολη... Please HELP!!!
  •  20-05-2012, 19:03 70281 σε απάντηση της 70280

    Απ: Update σε εγγραφη μεσω textBox σε WinForm

    y.commandtext=string.format("update krithrio1 set y={0} where x=25",z)

    Ο κώδικας είναι σε Vb.Net. Ίσως να έχει την ίδια σύνταξη σε C#.

  •  20-05-2012, 19:11 70282 σε απάντηση της 70280

    Απ: Update σε εγγραφη μεσω textBox σε WinForm


    Καλησπέρα

    Νομίζω ότι αυτό που θες είναι το παρακάτω:

    textBox1.Text=z; 
    SqlConnection x = new SqlConnection();
    SqlCommand y = new SqlCommand();
    x.ConnectionString=@"Data Source=KOSTAS-PC;Initial Catalog=form;Integrated Security=True";
    y.Connection = x; y.CommandText = ("update krithrio1 set y="+textBox1.Text+" where x=25");
    x.Open();
    y.ExecuteNonQuery();
    x.Close();
    new
    Form2().Show();

    Φυσικά χρησιμοποιώντας αυτόν τον κώδικα υποθέτεις ότι κάποιος θα βάλει στο textbox σωστή τιμή που δεν θα χτυπήσει στην εκτέλεση του update.


  •  20-05-2012, 20:05 70283 σε απάντηση της 70282

    Απ: Update σε εγγραφη μεσω textBox σε WinForm

    Ευχαριστω για τις απαντησεις το ελυσα το θεμα..μονο που θελω να εχω 3 textBoxes εκει αυτο που συμβαινει ειναι οτι και τα τρια κελια του ινακα παιρνουν την τιμη του πρωτου textBox..Ενω στην εντολη αλλαζουν...

  •  21-05-2012, 09:36 70285 σε απάντηση της 70283

    Απ: Update σε εγγραφη μεσω textBox σε WinForm

    Καλημέρα

    Αν θέλεις βάλε τον κώδικα που χρησιμοποιείς να τον δούμε, πάντως με την ίδια λογική δουλεύει.
  •  21-05-2012, 11:06 70286 σε απάντηση της 70285

    Απ: Update σε εγγραφη μεσω textBox σε WinForm

    Καταρχήν, να παρακαλέσω τον kos6101991 serakar να χρησιμοποιεί code blocks (είναι το τρίτο εικονίδιο από το τέλος του δεύτερου toolbar, αυτό με τα {} ) για να μπορεί να διαβαστεί ο κώδικας.

    Μετά, να παρατηρήσω ότι οι λύσεις που δόθηκαν ως τώρα είναι επικίνδυνες για τον γνωστό λόγο του SQL injection και θα αποτύχουν σίγουρα σε περιβάλλον με ελληνικά local settings. Είτε κάνει κάποιος string concatenation, είτε κάνει String.Format, η τιμή 0.6 στα ελληνικά θα μετατραπεί σε 0,6 και το SQL θα αποτύχει.

     Όσο για το SQL Injection, αν η τιμή z προέρχεται από user input, μπορεί άνετα ο χρήστης να βάλει κάτι "έξυπνο" όπως "0;drop table XXX; --" και να κάνει ζημιές.

    Για το λόγο αυτό ΔΕΝ ΠΡΕΠΕΙ ΠΟΤΕ να δημιουργούμε sql strings με concatenation ή String.Format (το ίδιο είναι εξάλλου).

    Ο σωστός (και ευκολότερος και ταχύτερος) τρόπος να περάσει κανείς παραμέτρους σε SQL είναι με parameterized queries:
                using(var conn = new SqlConnection(@"Data Source=KOSTAS-PC;Initial Catalog=form;Integrated Security=True"))
                {
                    var cmd = new SqlCommand("update krithrio1 set y=@y where x=@x", conn);
                    cmd.Parameters.AddWithValue("@y", 0.6);
                    cmd.Parameters.AddWithValue("@x", 25);
                    conn.Open();
                    cmd.ExecuteNonQuery();                
                }
    Ο παραπάνω κώδικας στέλνει τις παραμέτρους στο server με τον αρχικό τους τύπο, χωρίς μετατροπές σε string, με αποτέλεσμα να είναι αδύνατο το SQL Injection. Επίσης αποφεύγονται οι μετατροπές οπότε δεν έχουμε προβλήματα με υποδιαστολές. Τέλος, είναι πολύ ταχύτερος γιατί αφενός αποφεύγονται οι μετατροπές, αφετέρου ο server μπορεί να κρατήσει το ίδιο compiled query για αναφορά στο μέλλον, χωρίς να ξανακάνει compile. Επιπλέον, μεταφέρει λιγότερα bytes απ' ότι αν μετατρέπαμε την αντίστοιχη τιμή σε string. 
    Όλα αυτά τα οφέλη αθροίζονται όσο τρέχει μία εφαρμογή και μπορεί να γλυτώσουν χρόνο που ξεπερνάει ακόμα και το 50% αν γίνονται συχνές όμοιες κλήσεις στη βάση.

    Προβλήματα μετατροπής εμφανίζονται και όταν κανείς χρησιμοποιεί ημερομηνίες ή unicode strings με ελληνικό κείμενο. Χρησιμοποιώντας parameterized queries το πρόβλημα λύνεται άμεσα και ο κώδικας είναι λιγότερος.

    Προσοχή τέλος στο using. Οι ανοικτές συνδέσεις στις βάσεις κοστίζουν, γι αυτό και πρέπει να τις κλείνουμε πάντα. Το using φροντίζει να κλείσει η σύνδεση ακόμα και αν υπάρξει exception. Διαφορετικά θα πρέπει να περικλείσουμε το block σε ένα try/finally το οποίο θα ελέγχει αν άνοιξε η σύνδεση και θα την κλείνει στο finally. 

    Επιπλέον παραδείγματα για το πως περνάμε παραμέτρους υπάρχουν στο documentation της Parameters.AddWithValue και λεπτομερής περιγραφή υπάρχει στο Configuring Parameters and Parameter Data Types

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  21-05-2012, 12:43 70287 σε απάντηση της 70283

    Απ: Update σε εγγραφη μεσω textBox σε WinForm

    kos6101991:
    Ευχαριστω για τις απαντησεις το ελυσα το θεμα..μονο που θελω να εχω 3 textBoxes εκει αυτο που συμβαινει ειναι οτι και τα τρια κελια του ινακα παιρνουν την τιμη του πρωτου textBox..Ενω στην εντολη αλλαζουν...


    Ο κώδικας όπως τον έγραψε ο kos6101991 και τον άλλαξε ο serakar αποθηκεύει πρώτα την τιμή z στο control TextBox1.Text και μετά χρησιμοποιεί την τιμή του TextBox1.Text στο query. Αν το ίδιο γίνεται και για τα άλλα textboxes, η τιμή όλων αντικαθίσταται με την τιμή z, απ' όπου και αν προέρχεται αυτή. 

    Μήπως υπάρχει λάθος και αντί για 
    textBox1.Text=z;
    έπρεπε να είναι
    z=TextBox1.Text;
    Αν το κομμάτι κώδικα προέρχεται από κάποιο "μακρυνάρι" όπου η ίδια μεταβλητή z χρησιμοποιείται για διαφορετικά textboxes, η τιμή της θα είναι πάντα η αρχική τιμή.

    Υπάρχει και άλλο πιθανό πρόβλημα, καθώς η z προφανώς είναι string ενώ το SQL Statement φαίνεται ότι θέλει να την χρησιμοποιήσει ως αριθμό. Αν η z περιέχει '.' ή ',' θα υπάρξει πρόβλημα καθώς το σύμβολο για τα δεκαδικά εξαρτάται από το locale του χρήστη. Αν η ίδια τιμή χρησιμοποιηθεί από χρήστη με διαφορετικό locale, τα αποτελέσματα θα είναι διαφορετικά.

    Για να μην υπάρχει πρόβλημα θα πρέπει το πεδίo y της βάσης να είναι numeric με την απαιτούμενη ακρίβεια, και αντί να αποθηκευθεί η z να γίνει μετατροπή πχ. με την decimal.Parse για να είναι σίγουρο ότι στη βάση θα αποθηκευτεί αυτό που έδωσε ο χρήστης.

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

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems