C# OracleDataReader仅返回分页查询的最后一行

C# OracleDataReader仅返回分页查询的最后一行,c#,oracle,pagination,C#,Oracle,Pagination,我正在使用Oracle.ManagedDataAccess从数据库返回数据,我确实需要分页结果,因为这个表中有很多寄存器 因此,我使用了从post到分页的第二个答案,当我在Oracle客户机上运行时,它确实有效 最终查询如下所示: select * from ( select rownum as rn, a.* from ( Select u.* From users u order by u.user_c

我正在使用Oracle.ManagedDataAccess从数据库返回数据,我确实需要分页结果,因为这个表中有很多寄存器

因此,我使用了从post到分页的第二个答案,当我在Oracle客户机上运行时,它确实有效

最终查询如下所示:

select *
from (
    select rownum as rn, a.*
    from (
            Select  u.*
            From users u
            order by u.user_code
         ) a
     )
where   rownum <= :myReturnSize
and     rn > (:myReturnPage-1) * :myReturnSize;
cmd.BindByName = true;
但是当我从下面的.Net代码调用它时,它只返回我请求的100个寄存器中的最后一个

OracleParameter[] parameters = new OracleParameter[]{
    new OracleParameter("myReturnPage", page), //1
    new OracleParameter("myReturnSize", size)  //100
};

List<User> usersList = new List<User>();

using (OracleConnection conn = new OracleConnection(connString))
{
    using (OracleCommand cmd = new OracleCommand(sbSelect.ToString(), conn))
    {
        conn.Open();
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddRange(parameters);

        using (OracleDataReader odr = cmd.ExecuteReader())
        {
            if (!odr.IsClosed && odr.HasRows)
            {
                while (odr.Read())
                {
                    User userToReturn = new User();
                    FillUserEntity(userToReturn, odr);
                    usersList.Add(userToReturn);
                }
            }
        }
    }
}

return usersList.AsQueryable();
更奇怪的是,当我在没有分页的情况下以相同的方法运行这个查询时,它会返回所有寄存器,超过723000个

任何帮助都将不胜感激


非常感谢。

由于各种原因,Oracle倾向于使用存储过程而不是直接文本。我在SQL Developer中使用过不止几次,但在.Net中没有!通过在数据库端的包中的存储过程中将所有内容放在一起解决的情况。这也使您的查询与应用程序分离,因此,如果查询必须更改,您不必重新编译应用程序。然后,您的应用程序只进行与之前相同的调用,但调用存储过程,可能使用OracleDataAdapter

由于各种原因,Oracle倾向于使用存储过程而不是直接文本。我在SQL Developer中使用过不止几次,但在.Net中没有!通过在数据库端的包中的存储过程中将所有内容放在一起解决的情况。这也使您的查询与应用程序分离,因此,如果查询必须更改,您不必重新编译应用程序。然后,您的应用程序只进行与之前相同的调用,但调用存储过程,可能使用OracleDataAdapter

能否确认您的查询是否提供了来自Oracle客户端的正确输出

问题在于
其中rownum能否确认您的查询是否提供了来自Oracle客户端的正确输出

问题在于
其中rownum默认情况下,ODP.Net按位置而不是按名称设置参数。因此,在创建OracleParameter的数组时,只需颠倒顺序,并将BindByName属性设置为true,如下所示:

select *
from (
    select rownum as rn, a.*
    from (
            Select  u.*
            From users u
            order by u.user_code
         ) a
     )
where   rownum <= :myReturnSize
and     rn > (:myReturnPage-1) * :myReturnSize;
cmd.BindByName = true;

默认情况下,ODP.Net按位置而不是按名称设置参数。因此,在创建OracleParameter的数组时,只需颠倒顺序,并将BindByName属性设置为true,如下所示:

select *
from (
    select rownum as rn, a.*
    from (
            Select  u.*
            From users u
            order by u.user_code
         ) a
     )
where   rownum <= :myReturnSize
and     rn > (:myReturnPage-1) * :myReturnSize;
cmd.BindByName = true;

感谢您的快速回复,但这不是我的情况,与程序创建有关。如果我需要更改查询,我将通过一个发布过程,这对我是否需要重新编译proc或应用程序没有任何影响。此外,我的其他方法使用文本中的参数,工作起来很有魅力,所以我认为这不是我的问题。但无论如何,感谢您抽出时间。感谢您的快速回复,但这不是我的情况,与过程创建有关。如果我需要更改查询,我将通过一个发布过程,这对我是否需要重新编译proc或应用程序没有任何影响。此外,我的其他方法使用文本中的参数,工作起来很有魅力,所以我认为这不是我的问题。不过还是要感谢您抽出时间。我的答案格式不正确,可能是因为我是从移动应用发帖的。谢谢您的回复。从这个原则开始,我发现Oracle.ManagedDataAccess.Client出于某种疯狂的原因正在更改参数。我想,因为当我问,.Net时,它只返回了最后一个注册表,而您的回答返回了第一个注册表。所以我更改了值,结果成功了。我的答案格式不正确,可能是因为我是从移动应用发布的。谢谢你的回复。从这个原则开始,我发现Oracle.ManagedDataAccess.Client出于某种疯狂的原因正在更改参数。我想,因为当我问,.Net时,它只返回了最后一个注册表,而您的回答返回了第一个注册表。所以我改变了这些值,结果成功了。