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/finally,以便了解任何异常。 –

回答

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()直到它返回false

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

您需要使用usingsqlDataReader.Close()在退出时释放由读写器连接锁定。

+0

谢谢奥列格+1。确切的问题是我从来没有调用sqlDataReader.Read()来将读者定位到第一条记录 – Ananth

相关问题