Проблема с базой данных и DataTable

169
25 марта 2019, 23:40

У меня есть база данных и в ней есть 1 запись у которой Login = test123-Login , и Password = test123-Login. Но когда я ввожу Логин test123-Login и пароль test123-login (здесь l маленькая а в записи большая).

DataBaseHelper.cs

public static bool LoginExist(string login, string password)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection(connString))
            {
                connection.Open();
                string clearLogin = login.Trim();
                string clearPassword = password.Trim();
                DataTable dt = new DataTable();
                SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM [Table] WHERE Login=@clearLogin AND Password=@clearPassword", connection);
                cmd.Parameters.Add("clearLogin", SqlDbType.VarChar).Value = clearLogin;
                cmd.Parameters.Add("clearPassword", SqlDbType.VarChar).Value = clearPassword;
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dt);
                int count = Convert.ToInt32(dt.Rows[0][0].ToString());
                return count == 0 ? false : true;
            }
        }
        catch { MessageBox.Show("Ошибка авторизации! Перезапустите приложение.", "Ошибка авторизации", MessageBoxButton.OK, MessageBoxImage.Error); return false; }
    }

И когда я ввожу неправильный пароль то мне все равно дает зайти в главное приложение. Как это исправить?

И кто может то подскажите правильно ли я все делаю? И как лучше сделать реализацию авторизации?

Answer 1

Ошибка в том, что не указана длина типа varchar:

cmd.Parameters.Add("clearLogin", SqlDbType.VarChar).Value = clearLogin;

Таким образом, длина равна 1.

Размер нужно указать тот же, который у вас в таблице.

cmd.Parameters.Add("clearLogin", SqlDbType.VarChar, 24).Value = clearLogin;

К тому же, возможно, стоит использовать nvarchar - это позволит использовать не только английские буквы в логине и пароле (если вас это устраивает).

Использование DataTable в данном случае совершенно излишне.

Кроме того, следует диспозить (освобождать) все используемые ресурсы.

Давайте перепишем код:

using (SqlConnection connection = new SqlConnection(connString))
{
    connection.Open();
    string clearLogin = login.Trim();
    string clearPassword = password.Trim();
    using (SqlCommand cmd = new SqlCommand(
        "SELECT COUNT(*) FROM [Table] WHERE Login=@clearLogin AND Password=@clearPassword",
        connection))
    {
        cmd.Parameters.Add("clearLogin", SqlDbType.VarChar, 24).Value = clearLogin;
        cmd.Parameters.Add("clearPassword", SqlDbType.VarChar, 24).Value = clearPassword;
        int count = (int)cmd.ExecuteScalar();
        return count != 0;
    }
}
READ ALSO
Объединять сервер и приложение в одно решение?

Объединять сервер и приложение в одно решение?

Разрабатываю приложение на C# с сайтом и web api на aspnet

162
NancyFx устанавливается с ошибкой,как устранить?

NancyFx устанавливается с ошибкой,как устранить?

Изучаю фреймворк Nancy, как альтернативу тяжелому ASPnet

144
C# работа с 2мя IP

C# работа с 2мя IP

Всем приветПодскажите кто чем может

467