2013-07-27 13 views
14

nel mio programma, ho bisogno di verificare se esiste già un record nel database nella tabella utilizzando l'istruzione if. usando C# sto cercando di farlo attraverso una connessione sql. come suppongo che il comando ExecuteNonQuery(); restituisca un valore intero, se suppongo sia vero, voglio sapere quale valore è true per sapere che un determinato record esiste nella tabella o meno. Ecco un esempio del mio codice:Verificare se il record in una tabella esiste in un database tramite ExecuteNonQuery

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 SQLResult è stato inizializzato in precedenza nella principale int sqlresult; così mi piacerebbe sapere, che se l'utente 'Adam' esiste nel database o meno. e se esiste, allora voglio procedere con un 'se' dichiarazione dicendo per esempio:

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

in modo che io proprio non lo so il numero intero che dovrebbe tornare, e io non sono neanche sicuro che questo è il modo giusto per farlo.

grazie.

risposta

33

Se si desidera controllare se esiste l'utente, dovete cambiare il vostro SQL e utilizzare COUNT o EXISTS:

Così, 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 possibile utilizzare ExecuteScalar per recuperare il conteggio degli utenti con questo nome utente e password:

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

Si noti che è necessario utilizzare SQL-parametri 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(); 
    ... 
} 
+1

Vale la pena notare che sqlCommand.ExecuteScalar() restituisce un oggetto non un int: http://msdn.microsoft.com/en-us/library/system.data. sqlclient.sqlcommand.executescalar (v = vs.110) .aspx – TonE

+0

grazie per questo ottimo esempio, ho una domanda, dal tuo codice "using", è l'oggetto cast mancante a int dalla variabile userCount? o non è necessario? – WhySoSerious

+1

@WhySoSerious: grazie per averlo notato, l'ho aggiunto da quando mancava. Come @TonE ha già menzionato è richiesto perché 'ExecuteScalar' restituisce' oggetto'. –

7

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

2

Si dovrebbe fare un count(1) sul tavolo anziché uno select * e quindi executescalar per ottenere quel valore intero.

Utilizzando il codice esistente vorrei cambiare 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 prega di notare che ho usato è uguale a valori invece di valori come.

Anche se dovessi farlo, cambierei lo sql in linea per utilizzare una stored procedure.

3

vorrei utilizzare Select Top 1 Id piuttosto che il conteggio (*), perché può essere molto più veloce

0

Se un giorno che si desidera utilizzare EF basta fare:

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

O fai un metodo generico, in modo da poter gestire più entités:

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)); 
Problemi correlati