SqlDataReader sqlReader = null;
string query = string.Format("select * from Пользователи where Логин='{0}'", tBox_Login.Text);
SqlCommand com = new SqlCommand(query, myConnect);
sqlReader = com.ExecuteReader();
if(sqlReader.Read())
{
string password = string.Format("{0}", sqlReader["Пароль"]);
if (password == tBox_Password.Text)
{
lbl_ErrorMsg("OK!", true);
sqlReader.Close();
}
else
{
lbl_ErrorMsg("Пользователь или пароль не найден!", false);
sqlReader.Close();
}
//MessageBox.Show(sqlReader["Пароль"].ToString());
}
CREATE TABLE [dbo].[Пользователи](
[Ид] [int] NOT NULL,
[Логин] [nchar](50) NULL,
[Пароль] [nchar](50) NULL,
[Сотрудник] [nchar](50) NULL,
[Привилегии] [nchar](50) NULL
)
Все работает, НО в password
у меня получается значение "123 "
значение в базе "123"
Как для начинающего такой код приемлем, но...
Решение 1. Лучше всего использовать параметрическую выборку (плюс не будет проблемы инжекция, и улучшится быстродействие, сократится код, сверку пароля можно возложить на сервер а не на клиент)
using(SqlCommand com = new SqlCommand("select * from Пользователи where Логин=@login and Пароль=@pass", myConnect)) {
com.Parameters.AddWithValue("login",tBox_Login.Text);
com.Parameters.AddWithValue("pass",tBox_Pass.Text);
using (SqlDataReader sqlReader = com.ExecuteReader()) {
if (!sqlReader.Read()) {
// Пароль не верный
} else {
// Пароль верный
};
}
};
Решение 2. Можно заменить nchar
на nvarchar
(это может чуть замедлит но глюка не будет)
Решение 3. Можно в выборку добавить select rtrim(Логин) Логин, rtrim(Пароль) Пароль
(но может возникнуть проблема с "пробелом")
P.S. sql помнит почти все выборки которые выполнялись, чем меньше выборок тем лучше. Желательно что бы вариантов выборок который пишется в CommandText было как можно меньше - тогда база будет хорошо работать.
Ещё. Часто в серьёзных организациях действует политика, что никто пароль не знает, для этого используют md5 md4 или sha шифрование. В базе хранят хеш, а админ может лишь сбросить пароль в еденицу. В mssql это звучит так select hashbytes('md5','123')
msdn
Надо nchar
заменить на nvarchar
, поскольку первый умеет хранить только строки фиксированной длины, а всё с меньшими длинами добивает пробелами.
PS: И исправь sql injection.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Программа должна считывать из текстового файла (txt) весь текст и записывать его в массив строк по 100 символов
Как сформировать цифровую подпись интеркассы в aspnet mvc