1

Я пытался использовать параметризованный запрос с устройством чтения данных, когда получаю это сообщение об ошибке «Неверная попытка прочитать, когда нет данных».Ошибка - «Неверная попытка прочитать, когда данных нет». при использовании SQLDataReader, даже если данные присутствуют.

Но данные есть читатель!

enter image description here

Ниже приводится строка кода, который выполняет эту задачу

using (ConnectionManager connectionManager = new ConnectionManager()) 
{ 
    string query = @"SELECT * FROM LoginTab WHERE [email protected] " + 
       "AND [email protected]"; 

    List<SqlParameter> sqlParameterCollection = new List<SqlParameter>(); 
    sqlParameterCollection.Add(new SqlParameter("@username", SqlDbType.NVarChar) { Value = userName }); 
    sqlParameterCollection.Add(new SqlParameter("@password", SqlDbType.NVarChar) { Value = password }); 

    SqlDataReader sqlDataReader = connectionManager.ExecuteReader(query, CommandType.Text, sqlParameterCollection); 

    String roles = sqlDataReader[0].ToString(); 
    return roles; 
} 

функция ExecuteReader определен в другом классе.

public SqlDataReader ExecuteReader(String strcmd, CommandType type, List<SqlParameter> Parametercollections) 
{ 
    connnection = new SqlConnection(Connnectionstring); 
    command = new SqlCommand(strcmd, connnection); 
    command.CommandType = type; 
    foreach (SqlParameter paras in Parametercollections) 
    { 
     command.Parameters.Add(paras); 
    } 
    try 
    { 
     connnection.Open(); 
     reader = command.ExecuteReader(); 
    } 
    catch (SqlException E) 
    { 

    } 
    finally 
    { 

    } 

    return reader; 
} 

Что может быть неправильным здесь?

+1

Где читатель определен? Это может быть проблема, или читатель может быть закрыт, когда он доберется до точки, где вы пытаетесь ее прочитать. – Tim

+1

Не решение, но вы должны удалить try/catch/наконец, чтобы вы могли узнать обо всех исключениях. –

ответ

7

При вызове SqlCommand.ExecuteReader(), то SqlDataReader, что она дает вам изначально позиционируется перед тем первой записи. Вы должны позвонить SqlDataReader.Read(), чтобы перейти к первой записи, прежде чем пытаться получить доступ к любым данным. SqlDataReader.Read() возвращает true, если он смог перейти к первой записи; он возвращает false, если записей нет.

if (sqlDataReader.Read()) 
{  
    String roles = sqlDataReader[0].ToString(); 
    return roles; 
} 
else 
{ 
    // The user name or password is incorrect; return something else or throw an exception. 
} 
+0

Хороший улов, но мне все еще интересно, где «читатель» определен в коде OP ... – Tim

+0

Возможно поле. Нехорошо! –

+0

Спасибо, Майкл. Это решает проблему. – Ananth

1

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

using(SqlDataReader sqlDataReader = connectionManager.ExecuteReader()) 
{ 
    String roles=null; 
    if (sqlDataReader.Read()) 
    roles = sqlDataReader[0].ToString(); 
    return roles; 
} 

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

+0

Спасибо Oleg +1. Точная проблема заключалась в том, что я никогда не вызывал sqlDataReader.Read(), чтобы расположить читателя к первой записи – Ananth

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