C# 错误-“;当不存在数据时,尝试读取无效。”;使用SQLDataReader时,即使存在数据
当我收到以下错误消息“当没有数据存在时尝试读取无效”时,我正试图将参数化查询与数据读取器一起使用 但数据是有读者的 下面是执行此任务的代码行C# 错误-“;当不存在数据时,尝试读取无效。”;使用SQLDataReader时,即使存在数据,c#,sql-server,visual-studio,visual-studio-2010,sql-server-2005,C#,Sql Server,Visual Studio,Visual Studio 2010,Sql Server 2005,当我收到以下错误消息“当没有数据存在时尝试读取无效”时,我正试图将参数化查询与数据读取器一起使用 但数据是有读者的 下面是执行此任务的代码行 using (ConnectionManager connectionManager = new ConnectionManager()) { string query = @"SELECT * FROM LoginTab WHERE username=@username " + "AND password=@p
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;
}
使用(ConnectionManager ConnectionManager=new ConnectionManager())
{
字符串查询=@“从登录选项卡中选择*,其中用户名=@username”+
“和密码=@password”;
List sqlParameterCollection=新列表();
添加(新的SqlParameter(“@username”,SqlDbType.NVarChar){Value=username});
添加(新的SqlParameter(“@password”,SqlDbType.NVarChar){Value=password});
SqlDataReader SqlDataReader=connectionManager.ExecuteReader(查询,CommandType.Text,sqlParameterCollection);
字符串角色=sqlDataReader[0].ToString();
返回角色;
}
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;
}
公共SqlDataReader ExecuteReader(字符串strcmd、CommandType类型、列表参数集合)
{
connnection=newsqlconnection(Connnectionstring);
command=新的SqlCommand(strcmd,connection);
command.CommandType=类型;
foreach(参数集合中的SqlParameter段落)
{
命令.Parameters.Add(第2-3段);
}
尝试
{
connection.Open();
reader=command.ExecuteReader();
}
捕获(SQLE异常)
{
}
最后
{
}
返回读取器;
}
这里可能有什么问题?当您调用
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.
}
调用
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.
}
您应该检查
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()
来释放锁定的读卡器连接。您应该检查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()
,以释放锁定的读卡器连接。读卡器在哪里定义?这可能是一个范围问题,或者当读卡器到达您尝试读取它的位置时,读卡器可能会关闭。这不是解决方案,但您应该删除try/catch/finally,以便了解任何异常。读卡器在哪里定义?这可能是一个范围问题,或者当读卡器到达您尝试阅读它的位置时,读卡器可能会关闭。这不是解决方案,但您应该删除try/catch/finally,以便了解任何异常情况。捕捉良好,但我仍然好奇OP的代码中定义了reader
,捕捉良好,但我仍然很好奇,OP的代码中定义了阅读器
,谢谢Oleg+1。确切的问题是,我从来没有调用sqlDataReader.Read()将读取器定位到第一个记录。确切的问题是,我从未调用sqlDataReader.Read()将读取器定位到第一条记录