2015-07-19 3 views
0

У меня есть простое подключение к SQL Server, который не работает. Я пытаюсь прочитать данные из него, используя SqlDataReader в C#.SqlDataReader неожиданно возвращает null

Вот код:

bool ok = false; 

SqlConnection con = new SqlConnection(); 
con.ConnectionString = @"********"; 

SqlCommand cmd = new SqlCommand(); 
cmd.Parameters.AddWithValue("@a", uname); 
cmd.Parameters.AddWithValue("@b", pass); 
cmd.CommandText = @"SELECT username FROM admins WHERE pass='@b'"; 
cmd.Connection = con; 

SqlDataReader r; 

con.Open(); 
r = cmd.ExecuteReader(); 
r.Read(); 

string n; 
n = r.GetString(0); 

if (n != null) 
{ 
    ok = true; 
} 

con.Close(); 

if (ok) 
{ 
    Session["admin"] = uname; 
    Response.Redirect("admin_page.aspx"); 
} 
else 
{ 
    eror.Text = "An eror occured"; 
    Response.Redirect("index.aspx#work"); 
} 

Примечание: что в приведенном выше строка кода «uname» и «передать», безусловно, не равно нулю.

Примечание №2: Я попытался запустить r.read() в цикле while (хотя невозможно иметь более одной строки) ---> тот же результат.

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

n = r.GetString(0); 

С этим исключением:

исключение типа «System.InvalidOperationException» произошло в System.Data.dll, но не обрабатывался в коде пользователя

Дополнительная информация: Неверная попытка прочитать, когда данных нет.

Я как бы потерял здесь. Я знаю, что это, наверное, простая вещь, которую я пропустил здесь, я просто не могу ее найти. Есть идеи?

+1

'@ a' даже не используется в вашем запросе, и ваша проблема в том, что теперь строки возвращаются, поэтому вы получаете *** Неверная попытка прочитать, когда данные отсутствуют *** – Amit

+1

Пара вещей. Почему у вас есть параметр @a, когда вы его не используете? Кроме того, если вы добавляете параметры, вы не должны добавлять «символы» вручную в свой запрос. Он будет заботиться автоматически. Вы должны проверить, будет ли r.Read успешным (используйте возвращаемое значение), если это не ваши данные не найдены в базе данных. Я подозреваю, что это проблема. – Saragis

ответ

2

В дополнение к наблюдению Амит в о неиспользуемом параметре, вы злоупотребляете параметр

Где у вас есть

cmd.CommandText = @"SELECT username FROM admins WHERE pass='@b'"; 

вы не должны иметь кавычки значения, так:

cmd.CommandText = @"SELECT username FROM admins WHERE [email protected]"; 

Параметр будет знать, что это VARCHAR

+0

Удаление котировок вокруг значения решало его. большое спасибо. – user3107990

+0

Спасибо за поддержку. Обратите внимание, что ответ Амита идет дальше (дает вам информацию, о которой вы даже не спрашивали), объясняя, как лучше использовать результат запроса в вашем прецеденте.Я предлагаю вам принять его ответ, поэтому на вопрос ответили! – Stan

+0

@ user3107990: если этот ответ помог вам решить вашу проблему, пожалуйста, [** принять этот ответ **] (http://meta.stackoverflow.com/q/5234/153998). Это покажет вашу признательность тем, кто * провел свое время, чтобы помочь вам *. –

0

Ваш неиспользованный SqlDataReader правильно.

Если вы хотите знать, существует ли пользователь с правильным именем пользователя и паролем, ваш запрос, вероятно, следует: SELECT 1 FROM admins WHERE [email protected] AND [email protected]

После того, как это сделано, и так как вы все равно, что выбранное значение (вам только забота о том, чтобы был возвращенный ряд ...) Используйте следующую команду:

r = cmd.ExecuteReader(); 
ok = r.HasRows; 

После этого продолжайте, как и вы.

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