2013-11-08 3 views
2

Я использую C#, чтобы узнать ASP.NET, я попытался написать код аутентификации вНеверная попытка чтения при отсутствии данных присутствует в ASP.NET

SqlCommand command = new SqlCommand("Select [ID] from [Inspector] WHERE [ID] ='111' AND [Password] ='111';", conn); 

SqlDataReader dr = command.ExecuteReader(); 

if (dr[0].ToString() == username) 
{ 
Session["UserAuthentication"] = username; 
Session.Timeout = 1; 
Response.Redirect("About.aspx"); 
} 
else{ 
// ... 
} 

ID имеет тип numeric в SQL Server.

Этот вопрос я всегда получаю исключение:

Invalid попытка чтения, когда нет данных нет.

В этой части: if (dr[0].ToString() == username).

Я попытался выполнить точный оператор SQL напрямую, и я могу получить результат.

+5

** Не храните пароли в текстовом формате **. – SLaks

+0

@SLaks Я знаю это, но это всего лишь учебный код. – Aan

+0

Это круто, но может также узнать о хэшировании паролей http://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right. – harsimranb

ответ

7

Вам нужно перебрать строки читателя возвращается - с помощью кода что-то вроде этого:

SqlDataReader dr = command.ExecuteReader(); 

if(dr.Read()) 
{ 
    if (dr[0].ToString() == username) 
    { 
     Session["UserAuthentication"] = username; 
     Session.Timeout = 1; 
     Response.Redirect("About.aspx"); 
    } 
    else { 
     // ... 
    } 
} 

Вам нужно позвонить .Read() на SqlDataReader по крайней мере один раз, чтобы на самом деле чтения данные.

Если вы планируете читать столько строк, сколько есть, вы должны использовать

while (dr.Read()) 
{ 
    ..... 
} 

и иметь дело с несколько строк, возвращаемых.

4

Перед тем, как начать чтение данных, необходимо перенести DataReader в первую строку.
Звонок Read().

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