2017-10-17 5 views
1

J'ai essayé de le trouver. Mais je ne peux pas trouver exactement ma réponse. Je décide donc de poser ces questions. J'ai besoin de ton aide.Requête C# SqlCommand avec mise à jour

Je souhaite ajouter une valeur dans la valeur de la table sans écraser la colonne Debit, Score. Cela ajoutera de la valeur actuelle.

cmd = new SqlCommand("UPDATE Users SET [email protected], 
             [email protected] 
           WHERE [email protected]", con); 

con.Open(); 

cmd.Parameters.AddWithValue("@phone", textBox1.Text); 
cmd.Parameters.AddWithValue("@debit", textBox2.Text); 
cmd.Parameters.AddWithValue("@score", textBox3.Text); 

cmd.ExecuteNonQuery(); 

MessageBox.Show("Амжилттай"); 
con.Close(); 

Par exemple:

Table, Phone: 999 | Debit: 1500 | Score: 100 //current <br> 

Quand j'ajouter de la valeur à partir textBox1 = 999, textBox2 = 500, TextBox3 = 50

Table, Phone: 999, Debit: 2000, Score: 150 //updating like that 

Je sais requête SQL comme ça. Mais je ne sais pas comment écrire du code dans SqlCommand

UPDATE Users 
SET Debit = Debit + [user input], Score = Score + [user input] 
WHERE = Phone 

Toutes les suggestions?

(Désolé pour mon terrible Anglais J'espère que vous les gars comprendre ce que je suis en train de demander)

Merci

+0

vous SqlCommand semble bien, quel est le problème? – styx

Répondre

6

Si vous voulez ajouter , juste ajouter:

cmd = new SqlCommand(@"UPDATE Users 
          SET Debit = Debit + @debit, 
           Score = Score + @score 
         WHERE Phone = @phone", con); 

Veuillez noter verbatim chaîne @"..." syntaxe. S'il vous plaît, ne pas oublier disposer (explicite Close est un antimodèle):

string sql = 
    @"UPDATE Users 
     SET Debit = Debit + @debit, 
      Score = Score + @score 
    WHERE Phone = @phone"; 

//TODO: put the right connection string instead of "MyConnectionStringHere" 
//DONE: IDisposable (SqlConnection) should be wrapped into using 
using (var con = new SqlConnection("MyConnectionStringHere")) { 
    con.Open(); 

    //DONE: IDisposable (SqlCommand) should be wrapped into using 
    using (var cmd = new SqlCommand(sql, con)) { 
    //TODO: AddWithValue is often a bad choice; change to Add 
    cmd.Parameters.AddWithValue("@phone", textBox1.Text); 
    cmd.Parameters.AddWithValue("@debit", textBox2.Text); 
    cmd.Parameters.AddWithValue("@score", textBox3.Text); 

    cmd.ExecuteNonQuery(); 
    //TODO: a better policy is to read localized strings from resources 
    MessageBox.Show("Амжилттай"); 
    } 
} 
+0

Il a résolu mon problème. Merci! J'apprécie vraiment ça. :) –

1

Cela vous aidera .... juste essayer de cette manière ..

SqlCommand cmd = new SqlCommand("UPDATE Users SET Debit = Debit + " + textBox2.Text + ", Score = Score + " + textBox3.Text + " WHERE Phone = " + textBox1.Text + "", con); 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Амжилттай"); 
       con.Close(); 

OU

SqlCommand cmd = new SqlCommand("UPDATE Users SET Debit = Debit + @debit, Score = Score + @score WHERE Phone = @phone", con); 
       con.Open(); 
       cmd.Parameters.AddWithValue("@phone", textBox1.Text); 
       cmd.Parameters.AddWithValue("@debit", textBox2.Text); 
       cmd.Parameters.AddWithValue("@score", textBox3.Text); 
       cmd.ExecuteNonQuery(); 
       MessageBox.Show("Амжилттай"); 
       con.Close(); 
+0

S'il vous plaît, ne pas * hardcode * sql, mais utilisez * paramètres * (comme dans la question) –

+0

mais la sortie sera la même Dmitry Bychenko. –

+0

Oui, la sortie sera la même, mais: 1. (Presque) toutes les requêtes seront différentes (l'optimiseur devrait donc générer des plans pour chaque requête); 2. La requête est sujette à l'injection ** sql **: imaginez que 'textBox2.Text' contient, disons,' 123; --'. Dans ce cas, vous aurez la question suivante: '" UPDATE Users SET Debit = Débit + 123 - ... "(veuillez noter ** commentant **' --'). Donc, entrez '123; --' mettra à jour le * tableau entier *, pas seulement le téléphone requis –