Ошибка - «Недопустимая попытка чтения при отсутствии данных».при использовании SQLDataReader, даже если данные присутствуют - PullRequest
1 голос
/ 22 января 2012

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

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

enter image description here

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

using (ConnectionManager connectionManager = new ConnectionManager())
{   
    string query = @"SELECT * FROM LoginTab WHERE username=@username " +
              "AND password=@password";

    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;
}

Что здесь может быть не так?

Ответы [ 2 ]

7 голосов
/ 22 января 2012

Когда вы звоните 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.
}
1 голос
/ 22 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...