Пара комментариев:
- не объединяйте свои запросы SQL - используйте параметризованные запросы, чтобы избежать внедрения SQL
- вы должны поместить свои
SqlConnection
и SqlCommand
в using(....) { ... }
блоки
- если вы возвращаете два значения, вы не должны использовать
.ExecuteScalar()
- этот вызов работает только для одна строка, один столбец возвращает
В общем, ваш код должен выглядеть примерно так:
private void loginButton_Click(object sender, EventArgs e)
{
string connectionString = "datasource=STUFFZ;database=users";
string select = "SELECT Username, Password FROM dbo.RegularUsers " +
"WHERE Username = @user AND Password = @Pwd"
using(MySqlConnection myConn = new MySqlConnection(connectionString))
using(MySqlCommand command = new MySqlCommand(select, myConn))
{
command.Parameters.Add("@user", SqlDbType.VarChar, 50);
command.Parameters["@user"].Value = usernameBox.Text.Trim();
command.Parameters.Add("@pwd", SqlDbType.VarChar, 50);
command.Parameters["@pwd"].Value = passwordBox.Text.Trim();
myConn.Open();
using(SqlDataReader rdr = command.ExecuteReader())
{
if(rdr.Read())
{
string userName = rdr.GetString(0);
string password = rdr.GetString(1);
rdr.Close();
// here compare those values and do whatever you need to do
}
}
myConn.Close();
}
}
Более того, я думаю, что этот код немного запутан, так как вы выполняете доступ к данным (выбираете из SQL Server) и доступ к пользовательскому интерфейсу (считывает текстовые поля, открывают диалоговые окна) в одном и том же фрагменте кода -
Вы должны стремиться к большему разделению интересов, например,
- определить метод
CheckUserName
, который принимает имя пользователя и пароль в виде строки и возвращает, например, bool
- из вашего обработчика событий, получить информацию из пользовательского интерфейса (прочитать текстовые поля), вызвать эту отдельную функцию с этими значениями, а затем обработать возвращенное значение
Но смешивать пользовательский интерфейс, логику и код доступа к данным - это очень грязно и очень быстро требует обслуживания!