我正在尝试使用数据适配器扩展方法对查询进行分页。
这是我到目前为止所执行的:
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注入的约束。我正在考虑创建另一个SQLCommand实例并使用参数化查询,但是,我不确定参数化查询是否可以动态创建我的内部查询而不会转义常规SQL(我猜这种方法行不通)
Devart的Oracle DotConnect具有OracleDataReader
,可使用ExecutePageReader
对结果进行分页。我将其反编译,据我了解,他们正在使用StringBuilder生成支持分页的查询。但是,代码被混淆了,我最终无法获得解决方案。
编辑:
$"SELECT COUNT(*) FROM ({dbCommand.CommandText}) Q";
dbCommand.CommandText
由参数化查询构造(无字符串连接)