J'insère des données dans un tableau avec ce code ci-dessous.
SqlCommand cmd = new SqlCommand("INSERT INTO Users (Username,Password,FirstName,lastName,PhoneNumber,Address,City,State,Country,ZipCode,UserType,PayOut,TimeDate)" + ("VALUES ('" + TextBox1.Text + "','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','" + TextBox6.Text + "','" + TextBox7.Text + "','" + TextBox8.Text + "','" + TextBox9.Text + "','" + TextBox10.Text + "','" + TextBox11.Text + "','User','0','" + Date + "')"), con); cmd.ExecuteNonQuery();
Je veux get Id de l'insertion de la valeur dans la database que je sauvegarde les nouveldatatables dans la table quelqu'un peut avoir une idée de ce que je peux append dans un code afin que je puisse RETOUR @Identity de la valeur d'insertion dans la table.
Je vous remercie
Première utilisation de requêtes paramétrées (pour éviter les attaques par injection SQL)
var sql = "INSERT INTO Users (Username,Password,FirstName,lastName,PhoneNumber,Address,City,State,Country,ZipCode,UserType,PayOut,TimeDate)" + "values (@username, @password, @firstname, @lastname, @phone, @address, @city, @state, @country, @zipcode, @usertype, @payout, @timedate);" + "select SCOPE_IDENTITY()"; var cmd = new SqlCommand(sql); cmd.Parameters.AddWithValue("@username", TextBox1.Text); cmd.Parameters.AddWithValue("@password", TextBox3.Text); cmd.Parameters.AddWithValue("@firstname", TextBox4.Text); cmd.Parameters.AddWithValue("@lastname", TextBox5.Text); cmd.Parameters.AddWithValue("@phone" TextBox6.Text); //and so on var id = Convert.ToInt32(cmd.ExecuteScalar());
SCOPE_IDENTITY
renvoie le dernier identifiant créé pour la ligne insérée dans une scope donnée. De cette façon, vous récupérez l'identifiant. Utilisez la méthode ExecuteScalar()
qui renvoie une valeur de la première ligne, première colonne.
Ne stockez pas non plus de text clair comme mot de passe, utilisez une méthode de hachage.
changez votre sql et code comme ci-dessous
pour sql 2005+
INSERT INTO Users (UserId,otherdata...) OUTPUT INSERTED.ID VALUES(@UserId, @othervalues...)
pour sql 2000
INSERT INTO aspnet_GameProfiles(UserId,otherdata...) VALUES(@UserId, @othervalues...); SELECT SCOPE_IDENTITY()
Et alors
Int32 newId = (Int32) myCommand.ExecuteScalar();
Suggestion:
Faire usage de la requête paramétrer pour éviter l'attaque par injection SQL ….
Le moyen le plus simple serait d'append "SELECT SCOPE_IDENTITY ()" à votre instruction SQL. Vous devez paramétrer votre requête pour éviter l'injection SQL, et cela ressemblerait à ceci:
ssortingng sql = @" INSERT INTO Users (Username,Password,FirstName,lastName,PhoneNumber, Address,City,State,Country,ZipCode,UserType,PayOut,TimeDate) VALUES(@Username, @Password, ...) SELECT SCOPE_IDENTITY() "; SqlCommand cmd = new SqlCommand(sql, ...); ... append parameters ... var identity = (decimal) cmd.ExecuteScalar();
Si votre colonne d'identité est un integer, vous pouvez soit convertir de décimal en integer, ou faire la dissortingbution dans SQL Server, par exemple
ssortingng sql = @" INSERT INTO Users ... SELECT CAST(SCOPE_IDENTITY() AS INT) "; SqlCommand cmd = new SqlCommand(sql, ...); ... append parameters ... var identity = (int) cmd.ExecuteScalar();
Notez que SCOPE_IDENTITY
est généralement un meilleur choix que @@IDENTITY
. Dans la plupart des cas, ils returnneront la même valeur. Mais, par exemple, si votre instruction INSERT provoque le triggersment d'un sortinggger, qui insère une valeur d'identité dans une seconde table, alors c'est la valeur d'identité insérée dans cette seconde table qui sera renvoyée par @@IDENTITY
. L'utilisation de SCOPE_IDENTITY évite ce problème.