I’m working on a user login system for a semester final. I am using C# in Visual Studio with ADO.NET. I have a query that I use on a database table named Credentials:
SELECT * FROM Credentials WHERE Username = @Username AND Password = @Password
I also have the string connection as
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;
I then run the query against the table with int count = selectCommand.ExecuteNonQuery();
. selectCommand
is the SqlCommand
object with the above query in it. No matter what, count will equal -1 even if I enter an existing username and password. I want the count variable to be 1 when someone enters in a correct username and password combo.
class DatabaseConnection { public static SqlConnection GetConnection() { SqlConnection connection = new SqlConnection( "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|UserCredentials.mdf;Integrated Security=True;" ); return connection; } } class LoginDB { public static bool IsUser(string username, string password) { SqlConnection connection = DatabaseConnection.GetConnection(); string selectStatement = @"SELECT * FROM Credentials WHERE Username = @Username AND Password = @Password"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection); selectCommand.Parameters.AddWithValue("@Username", username); selectCommand.Parameters.AddWithValue("@Password", password); try { connection.Open(); int count = selectCommand.ExecuteNonQuery(); MessageBox.Show(count.ToString()); if (count > 0) { return true; } else { return false; } } catch (SqlException ex) { throw ex; } finally { connection.Close(); } } }
And then finally in the login form when the user presses login (The message box is just a placeholder for now):
private void btnLogin_Click(object sender, EventArgs e) { if (LoginDB.IsUser(txtUsername.Text, txtPassword.Text)) { MessageBox.Show("Logged in!"); } }
Obviously this is just for a college project so don’t say anything about how this is clearly an unsafe way to log users into a system.
Advertisement
Answer
ExecuteNonQuery is not what you want to execute. It is a query. You should use ExecuteReader which returns a SqlDataReader and then you can read how many rows are returned. Or ExecuteScalar will return only one column of one row.