首页 > 解决方案 > 使用 DataAdapter 对查询进行分页

问题描述

我正在尝试使用数据适配器扩展方法对我的查询进行分页。

这是我迄今为止实施的:

public static PagingInformation ExecutePagingInformation(
    this IDbCommand dbCommand, int pageIndex, int pageSize,
    CancellationToken cancellationToken = default)
{
    string oldCommandText = dbCommand.CommandText;
    dbCommand.CommandText = $"SELECT COUNT(*) FROM ({dbCommand.CommandText}) Q";
    var totalCount = Convert.ToInt32(dbCommand.ExecuteScalar());
    dbCommand.CommandText = oldCommandText;

    return new PagingInformation(pageIndex, pageSize, 0, totalCount); 
}



public static DbDataReader ExecutePagedReader(
   this IDbCommand dbCommand, int pageIndex, int pageSize, 
   out PagingInformation pageInformation)
{
    if (dbCommand.CommandType != CommandType.Text)
        throw new InvalidOperationException("Only CommandType.Text is supported.");

    DbDataReader reader;
    if (dbCommand is OracleCommand oracleCommand)
    {
        pageInformation = dbCommand.ExecutePagingInformation(pageIndex, pageSize); //this is implemented by myself
        reader = oracleCommand.ExecutePageReader(CommandBehavior.Default, pageIndex * pageSize, pageSize); //this is native method
    }
    else
    {
        throw new NotSupportedException();
    }


    return reader;

}

然后我像使用它们一样

using (var reader = cmd.ExecutePagedReader(pageIndex, pageSize, out pagingInformation))
{
    while (await reader.ReadAsync(cancellationToken))
    {
        result.Add(reader[0].ToString());
    }
}

问题是$"SELECT COUNT(*) FROM ({dbCommand.CommandText}) Q";SQL Injection影响的部分。我正在考虑创建另一个 SQLCommand 实例并使用参数化查询,但是,我不确定参数化查询是否可以在不转义常规 SQL 的情况下动态创建我的内部查询(我想这种方法行不通)

Devart 的 DotConnect For OracleOracleDataReader使用ExecutePageReader. 我对其进行了反编译,据我所知,他们正在使用 StringBuilder 生成支持分页的查询。但是,代码被混淆了,我最终无法找到解决方案。

编辑:

$"SELECT COUNT(*) FROM ({dbCommand.CommandText}) Q";

dbCommand.CommandText由参数化查询构造(无字符串连接)

标签: c#sqlpaginationado.net

解决方案


推荐阅读