Чтение из базы SqlReader C#

357
08 февраля 2017, 22:31
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"

Answer 1

Как для начинающего такой код приемлем, но...

  1. Решение 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. Решение 2. Можно заменить nchar на nvarchar (это может чуть замедлит но глюка не будет)

  3. Решение 3. Можно в выборку добавить select rtrim(Логин) Логин, rtrim(Пароль) Пароль (но может возникнуть проблема с "пробелом")

P.S. sql помнит почти все выборки которые выполнялись, чем меньше выборок тем лучше. Желательно что бы вариантов выборок который пишется в CommandText было как можно меньше - тогда база будет хорошо работать.

Ещё. Часто в серьёзных организациях действует политика, что никто пароль не знает, для этого используют md5 md4 или sha шифрование. В базе хранят хеш, а админ может лишь сбросить пароль в еденицу. В mssql это звучит так select hashbytes('md5','123') msdn

Answer 2

Надо nchar заменить на nvarchar, поскольку первый умеет хранить только строки фиксированной длины, а всё с меньшими длинами добивает пробелами.

PS: И исправь sql injection.

READ ALSO
Текст из файла в строку

Текст из файла в строку

Программа должна считывать из текстового файла (txt) весь текст и записывать его в массив строк по 100 символов

379
Цифровая подпись интеркассы в asp.net [требует правки]

Цифровая подпись интеркассы в asp.net [требует правки]

Как сформировать цифровую подпись интеркассы в aspnet mvc

339
Поиск элеметов XML и их вывод

Поиск элеметов XML и их вывод

Есть XML, который имеет простую структуру:

362