当我收到此错误消息“无数据存在时读取无效尝试。”
我试图在数据读取器中使用参数化查询。但数据是有读者的!
以下是执行此任务的代码行
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;
}
这里可能有什么问题?
答案 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;
}
您需要在退出时使用using
或sqlDataReader.Close()
以释放锁定的读者连接。