错误 - “没有数据时无效尝试读取”。即使数据存在,也使用SQLDataReader

时间:2012-01-22 19:19:12

标签: c# sql-server visual-studio visual-studio-2010 sql-server-2005

当我收到此错误消息“无数据存在时读取无效尝试。”

我试图在数据读取器中使用参数化查询。

但数据是有读者的!

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 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:1)

您应该检查SqlDataReader.HasRows是否为真,或者SqlDataReader.Read()前进,直到它返回false

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

您需要在退出时使用usingsqlDataReader.Close()以释放锁定的读者连接。