2013-11-26 3 views
1

У меня есть таблица, в которой есть список имен пользователей и паролей, и я хочу, чтобы имя пользователя и пароль совпадали с тем, который был сохранен в БД. Код, который я использую, только извлекает информацию для входа в первую запись в таблице users, как я могу изменить это, чтобы код работал для всего пользователя.Извлечение пароля пользователя из базы данных

Я НАЧИНАЮЩИЙ на VS, и я пытаюсь изучить основы так позже я буду реализовывать более сложные страницы входа с шифрованием .. Спасибо

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     SqlConnection cn = new SqlConnection(); 
     SqlCommand cmd = new SqlCommand(); 
     SqlDataReader dr; 

     cn.ConnectionString = "Server=;Database=;User Id=naljalid;Password="; 
     cmd.Connection = cn; 
     string username = tbxUserName.Text; 
     cmd.CommandText = "SELECT UserPassword FROM tblLoginProject WHERE UserName=username"; 

     // open a connection to DB 
     cn.Open(); 

     //read the table 
     dr = cmd.ExecuteReader(); 

     //read a record from te data reader 
     dr.Read(); 

     // compare the passwords 


     if (tbxPassword.Text == dr.GetString(0)) 
     { 
      MessageBox.Show("Hello"); 
     } 

     else 
     { 
      MessageBox.Show("Login failed, please re-enter your password"); 
     } 
    } 
+0

Зачем вам загружать всех пользователей, если только один входит в систему? Просто удалите предложение WHERE и сохраните результаты в контейнере где-нибудь в своем приложении, если это то, что вы хотите. – OldProgrammer

ответ

1

Изменить запрос tidge к этому:

cmd.CommandText = "SELECT UserPassword FROM tblLoginProject WHERE UserName = @username"; 

, а затем установить, что значение параметра:

cmd.Parameters.AddWithValue("@username", tbxUserName.Text); 

Это поможет вам строку Fo r пользователь, которого вы ищете. Теперь еще несколько рекомендаций. Классы ADO.NET реализуют интерфейс IDispoable. Этот интерфейс определяет, что класс использует некоторые неуправляемые ресурсы. Вы хотите удостовериться, что их устраивают. Рассмотрим следующий переписывают текущего кода:

using (SqlConnection cn = new SqlConnection("Server=;Database=;User Id=naljalid;Password=")) 
using (SqlCommand cmd = new SqlCommand("SELECT UserName FROM tblLoginProject WHERE UserName = @username AND Password = @password", cn)) 
{ 
    cn.Open(); 

    cmd.Parameters.AddWithValue("@username", tbxUserName.Text); 
    cmd.Parameters.AddWithValue("@password", tbxPassword.Text); 

    var result = cmd.ExecuteScalar() as string; 
    if (string.IsNullOrEmpty(result)) 
    { 
     // user was not found 
    } 
    else 
    { 
     // user was found 
    } 
} 

Он использует using заявление, чтобы гарантировать, что объекты получить расположены.

+1

Спасибо, что он наконец-то работал :) – nj2012

2

Ключом к этому является запрос SQL, в частности, раздел WHERE:

SELECT UserPassword FROM tblLoginProject 

Этот запрос вернет все пароли из базы данных. Но вы хотите, чтобы восстановить пароль только один пользователь, поэтому вам необходимо реализовать ИНЕКЕ

SELECT UserPassword FROM tblLoginProject WHERE UserName = @username 

Этот запрос будет восстановить пароль только для определенного пользователя, где значение поля UserName равно значение, переданное в параметр @username. Итак, теперь мы должны обязательно передать это значение. Вы не можете просто включите его в SQL-запрос, как вы делаете прямо сейчас. Мы делаем это следующим образом:

cmd.Paramateres.AddWithValue("@username", username); 

Это должно работать нормально, но для наилучшей практики вы должны проверить, как для пользователя и пароля в то же время:

SELECT count(*) FROM tblLoginProject WHERE UserName = @username AND UserPassword = @password 

Тогда, конечно, мы проходим как значения:

cmd.Paramateres.AddWithValue("@username", username); 
cmd.Paramateres.AddWithValue("@password", password); 

Это возвращает 0, если ни один пользователь не найдено с этой комбинацией имени пользователя и пароля (неверный логин) или более 0, если такое а.е. ser (действительный логин).

Следующая остановка Вам следует исследовать хеширующие пароли. После этого будут солить эти хеши. Удачи!

+0

Большое вам спасибо за помощь – nj2012

Смежные вопросы