dans mon programme, je dois vérifier si un enregistrement dans la base de données existe déjà dans la table à l'aide de l'instruction if
. en utilisant c # j'essaie de le faire via une connexion sql. comme je supposais que la commande ExecuteNonQuery();
renvoie une valeur entière, si ma supposition est vraie, je veux savoir quelle valeur est vraie pour savoir qu'un certain enregistrement existe ou non dans la table. voici un exemple de mon code:
using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString")))
{
using (SqlCommand sqlCommand = new SqlCommand("SELECT * from users where user_name like 'Adam' AND password like '123456'", sqlConnection))
{
sqlresult = sqlCommand.ExecuteNonQuery();
}
}
considérant que sqlresult a été initialisé précédemment dans la version principale comme int sqlresult;
donc je voudrais savoir que si cet utilisateur 'Adam' existe ou non dans la base de données. et s'il existe, alors je veux procéder avec une déclaration "si" disant par exemple:
if(sqlresult == 0)
{
MessageBox.Show("Adam exists!");
}
donc je ne sais tout simplement pas l'entier qu'il devrait retourner, et je ne suis pas sûr que ce soit la bonne façon de le faire.
merci.
Si vous voulez vérifier si l'utilisateur existe, vous devez changer votre sql et utiliser COUNT
ou EXISTS
:
Donc au lieu de
SELECT * from users where user_name like 'Adam' AND password like '123456'
cette
SELECT COUNT(*) from users where user_name like 'Adam' AND password like '123456'
Vous pouvez maintenant utiliser ExecuteScalar
pour récupérer le nombre d'utilisateurs avec ce nom d'utilisateur et ce mot de passe:
int userCount = (int) sqlCommand.ExecuteScalar();
if(userCount > 0)
// user exists ....
Notez que vous devez utiliser les paramètres sql pour éviter sql-injection :
using (SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) from users where user_name like @username AND password like @password", sqlConnection))
{
sqlConnection.Open();
sqlCommand.Parameters.AddWithValue("@username", userName);
sqlCommand.Parameters.AddWithValue("@password", passWord);
int userCount = (int) sqlCommand.ExecuteScalar();
...
}
Vous devez utiliser ExecuteScalar
pour vérifier si l'enregistrement existe. ExecuteNonQuery
exécute une instruction transact-SQL sur la connexion et renvoie le nombre de lignes affectées pour UPDATE, INSERT ou DELETE. Il ne s'applique pas aux instructions SELECT
J'utiliserais Select Top 1 Id plutôt que le nombre (*) car cela peut être beaucoup plus rapide
Vous devez faire une count(1)
sur la table au lieu d'une select *
puis executescalar
pour obtenir cette valeur entière.
En utilisant votre code existant, je le changerais comme suit:
using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString")))
{
using (SqlCommand sqlCommand = new SqlCommand("SELECT count(1) from users where user_name = 'Adam' AND password = '123456'", sqlConnection))
{
sqlresult = sqlCommand.ExecuteNonQuery();
}
}
Veuillez noter que j'ai utilisé des valeurs égales au lieu de valeurs similaires.
De plus, si je faisais cela, je changerais votre sql en ligne pour utiliser une procédure stockée.
Si un jour vous souhaitez utiliser EF, faites simplement:
private MyDb db = new MyDb();
public bool UserExists(string userName, string password){
return db.Users.Any(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase)
&& x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));
}
Ou faites une méthode générique, afin que vous puissiez gérer plusieurs entites:
public bool EntityExists<T>(Expression<Func<T, bool>> predicate) where T : class, new()
{
return db.Set<T>().Any(predicate);
}
Usage:
EntityExists<Users>(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase)
&& x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));