Verifica se il record in una tabella esiste in un database tramite ExecuteNonQuery

nel mio programma ho bisogno di verificare se un record nel database esiste già nella tabella usando l’istruzione if . usando c # sto cercando di farlo attraverso una connessione sql. come supponevo che ExecuteNonQuery(); comando restituisce un valore intero, se suppongo sia vero, voglio sapere quale valore è true per sapere che un certo record esiste nella tabella o meno. ecco un esempio del mio codice:

 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(); } } 

considerando che sqlresult è stato inizializzato precedentemente nel main come int sqlresult; quindi mi piacerebbe sapere che se questo utente ‘Adam’ esiste nel database o no. e se esiste, allora voglio procedere con una dichiarazione ‘if’ che dice ad esempio:

 if(sqlresult == 0) { MessageBox.Show("Adam exists!"); } 

quindi non conosco il numero intero che dovrebbe restituire, e non sono sicuro che questo sia il modo giusto per farlo.

grazie.

Se si desidera verificare se l’utente esiste, è necessario modificare sql e utilizzare COUNT o EXISTS :

Quindi invece di

 SELECT * from users where user_name like 'Adam' AND password like '123456' 

Questo

 SELECT COUNT(*) from users where user_name like 'Adam' AND password like '123456' 

Ora puoi utilizzare ExecuteScalar per recuperare il conteggio degli utenti con questo nome utente e password:

 int userCount = (int) sqlCommand.ExecuteScalar(); if(userCount > 0) // user exists .... 

Nota che dovresti usare sql-parameters per prevenire 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(); ... } 

Dovresti utilizzare ExecuteScalar per fare il tifo se il record esiste. ExecuteNonQuery esegue ExecuteNonQuery transact-SQL sulla connessione e restituisce il numero di righe interessate per un UPDATE, INSERT o DELETE. Non si applica per le istruzioni SELECT

Dovresti fare un count(1) sul tavolo invece di un select * e poi executescalar per ottenere quel valore intero.

Usando il tuo codice esistente lo cambierei per essere:

 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(); } } 

Si noti che ho usato valori uguali invece di valori simili.

Anche se dovessi farlo, cambierei il tuo inline sql per usare una stored procedure.

Vorrei utilizzare Seleziona l’ID 1 piuttosto che il conteggio (*) perché può essere molto più veloce

Se un giorno vuoi usare EF, semplicemente:

 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)); } 

Oppure fai un metodo generico, così puoi gestire più entrate:

 public bool EntityExists(Expression> predicate) where T : class, new() { return db.Set().Any(predicate); } 

Uso:

 EntityExists(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase) && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));