我正在使用 Oracle.ManagedDataAccess 从我的数据库返回数据,我确实需要对结果进行分页,因为该表中有很多寄存器。
所以我使用了 this 中的第二个答案发布到分页,当我在 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;
但是当我从下面的 .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();
更奇怪的是,当我在没有分页的情况下以相同的方法运行此查询时,它会返回所有寄存器,超过 723,000。
如有任何帮助,我们将不胜感激。
非常感谢。
最佳答案
默认情况下,ODP.Net 按位置而非名称设置参数。因此,您只需要在创建 OracleParameter 的数组时反转顺序,并将 BindByName 属性设置为 true,如下所示:
cmd.BindByName = true;
关于c# - OracleDataReader 只返回分页查询的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41364022/