2009-02-19 2 views
4

У меня есть следующий код в моем btn_click события:Как я могу получить имя пользователя и пароль из моей базы данных на C#?

Sqlconnection con = new Sqlconnection("server=.;database=bss;user id=ab;pwd=ab"); 
con.open(); 
SqlCommand cmd = new Sqlcommand("select * from login where username='" 
+ txt4name.Text + "' and pwd='" + txt4pwd.Text + "'", con); 

SqlDataReader reader = cmd.execute Reader(); 

Где login это таблица и username и pwd являются его поля. После этого кода все значения сохраняются в объекте reader. Я хочу хранить username и pwd в отдельных переменных.

Как это сделать?

+1

Не могли бы вы плз дайте свой вопрос немного более описательный имя – Jonik

+6

Не могли бы вы написать «пожалуйста» вместо «плз»? – Bombe

+1

Не катите это название назад. – GEOCHET

ответ

12

В общем, при попытке доступа к БД, вы должны использовать что-то похожее на это вместо того, чтобы устранить уязвимости SQL-инъекции:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM USERS WHERE [email protected] AND PASSWORD=HASHBYTES('SHA1', @password)", myConnection)) 
    {      
     myCommand.Parameters.AddWithValue("@username", user); 
     myCommand.Parameters.AddWithValue("@password", pass); 

     myConnection.Open(); 
     SqlDataReader myReader = myCommand.ExecuteReader()) 
     ................... 
    } 

Но более реалистично хранить учетные данные, вы должны использовать что-то вроде Membership system вместо того, чтобы кататься самостоятельно.

+0

Единственная проблема заключается в том, что если он должен был пойти и использовать этот код, он, скорее всего, ничего не вернет, потому что у меня есть ощущение, что он не использует какие-либо шифрования для своих паролей. То, что вы предлагаете, - это, безусловно, лучшие практики, но это может помочь добавить в объяснение пароли. – TheTXI

+1

@TheTXI: Все в порядке, я не хочу, чтобы он использовал этот код. Я хочу, чтобы он использовал поставщиков членства. – GEOCHET

+0

+1 для упоминания использования хэша SHA1. Если вы делаете рулон самостоятельно, вы действительно должны использовать хеши вместо хранения паролей открытого текста в базе данных. –

0
string userName = txt4name.Text; 
string password = txt4pwd.Text; 

Действительно ли это, что вы хотите? Просто чтобы получить эти данные в переменные?

+0

О да. Но если я хочу извлечь его из читателя, то ??? – Siddiqui

4

Если вы имеете в виду C# переменных, и если вы хотите, чтобы получить их из БД, просто сделать это:

SqlDataReader reader = cmd.execute Reader(); 
if (reader.Read()) 
{ 
    string username = reader["username"]; 
    string pwd = reader["password"]; 
} 

Пока вы на него, параметризировать запрос и предотвратить SQL инъекции:

SqlCommand cmd = new Sqlcommand("select * from login where [email protected]ername and [email protected]", con); 
cmd.Parameters.AddWithValue("@username", txt4name.Text); 
cmd.Parameters.AddWithValue("@pwd", txt4pwd.Text); 
+1

Вы действительно не должны защищать такое хранилище учетных данных. – GEOCHET

+0

Не выступать, просто рассказывая. Мы не знаем, будет ли это входить в код реального времени или запрашивается только для учебных целей. –

+0

@buyutec: Вы по-прежнему несете ответственность за информирование и обучение. – GEOCHET

2

Определенно прислушаться к советам о инъекции SQL, но вот ответ на ваш вопрос:

String username; 
String pwd; 

int columnIndex = reader.GetOrdinal("username"); 

if (!dataReader.IsDBNull(columnIndex)) 
{ 
    username = dataReader.GetString(columnIndex); 
} 

columnIndex = reader.GetOrdinal("pwd"); 

if (!dataReader.IsDBNull(columnIndex)) 
{ 
    pwd = dataReader.GetString(columnIndex); 
} 
0

Вам действительно нужно использовать параметризованный SQL. There's an example here Кроме того, ваш вопрос не имеет смысла; вы хотите, чтобы имя пользователя и пароль находились в отдельных переменных? они уже являются отдельными в вашем примере. Если вы не можете назначить их для строк, я предлагаю следующие tutorials.

-3

Обычно вы можете найти основные примеры использования на MSDN, например this one for SqlDataReader.

+0

Ответы GIYF действительно не приветствуются здесь. , или просто оставить его в покое. – GEOCHET

+0

@Rich B, как предоставить ссылку на ресурс, содержащий ответ, не помогает? О, я вижу, у вас есть хорошее соотношение вверх/вниз. Удачи в вашем личном крестовом походе. – Constantin

+1

@Constantin: Просто указывая ссылку, вы смотрите здесь. Объясните свой ответ. Сделайте работу. – GEOCHET

0

Другой подход заключается в загрузке результатов читателя в DataTable так:

DataTable Result = new DataTable(); 

Result.Load(reader); 

Если таблица Логин содержит только два столбца (имя пользователя и пароль), которые являются уникальными в итоге вы получите результат, содержащий только одну строку с информацией. Вы можете получить значения столбцов из каждого столбца:

string userName = Result.Rows[0].Field<string>("userName"); 
string password = Result.Rows[0].Field<string>("pwd"); 
0
private void but_login_Click(object sender, EventArgs e) 
{ 
    string cn = "Data Source=.;Initial Catalog=mvrdatabase;Integrated Security=True"; 
    SqlConnection con = new SqlConnection(cn); 
    con.Open(); 
    SqlCommand cmd = new SqlCommand("select count (*) from logintable where username ='" + txt_uname.Text + "'and password='" + txt_pass.Text + "'", con); 
    int i = Convert.ToInt32(cmd.ExecuteScalar()); 
    con.Close(); 

    if (i == 1) 
    { 
     Form2 f2 = new Form2(); 
     MessageBox.Show("User login successfully........"); 
     this.Hide(); 
     f2.Show(); 
    } 
    else 
    { 
     MessageBox.Show("INCORRECT USERID AND PASSWORD", "Error"); 
    } 
} 
Смежные вопросы