Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误-“;当不存在数据时,尝试读取无效。”;使用SQLDataReader时,即使存在数据_C#_Sql Server_Visual Studio_Visual Studio 2010_Sql Server 2005 - Fatal编程技术网

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()将读取器定位到第一条记录