Присвоить переменной значение ячейки
Делаю запрос в БД Users, запрос для авторизации. Заодно нужно переменной 'office' присвоить значение из столбца logo данной строки.
Клиент вводит логин и пароль. Идет сравнение с базой и нужно еще вытащить значение из ячейки для дальнейшего сравнения (смотрите код).
Не могу сообразить, как составить запрос.
private void InputButton_Click(object sender, EventArgs e)
{
string office="";
SqlCommand cmd = sqlConn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from Users where login = '" + LoginBox.Text + "'and password= '" + PasswordBox.Text + "' and office=logo";
if (office=="P1")
{
}
Ответы (1 шт):
Ресурсы нужно освобождать. Для этого заключаем их в блоки using.
SQL-запросы нельзя составлять с помощью конкатенации строк. Причина: Внедрение SQL-кода. Взамен используем параметры.
Так как вам в данном конкретном случае нужно вернуть всего одно значение, то в запросе пишем select logo .... И используем метод ExecuteScalar.
Если запрос не нашёл пользователя с совпадающим логином и паролем, то вернётся значение null. Можете использовать проверку if (office == null) ....
string office;
string sql = "select logo from Users where login = @login and password = @password";
using (var sqlConnection = new SqlConnection(_connectionString))
{
sqlConnection.Open();
using (var sqlCommand = sqlConnection.CreateCommand())
{
sqlCommand.CommandText = sql;
sqlCommand.Parameters.Add("login", SqlDbType.NVarChar).Value = LoginBox.Text;
sqlCommand.Parameters.Add("password", SqlDbType.NVarChar).Value = PasswordBox.Text;
office = (string)sqlCommand.ExecuteScalar();
}
}
Здесь _connectionString - строка соединения. Она является полем класса.
А теперь самое главное. Не храните в БД пароли! В базе данных должны храниться хеши паролей, и желательно с солью. Вот замечательная статья по теме: Adding Salt to Hashing: A Better Way to Store Passwords. Большая, но зато подробно объясняющая, что к чему.
И почему в таблице колонка называется logo, а в коде вы используете office?
