【发布时间】:2023-04-10 17:13:02
【问题描述】:
我有这个 SP(为展览而极度简化)
SELECT colA, colB, colC
INTO #MyTable
select COUNT(*) from #MyTable
在 C# 方面,我有
int total = 0;
var command = _context.CreateStoreCommand(
"dbo.mySP",
CommandType.StoredProcedure,
new SqlParameter("Param1", parameters.Param1),
//...
);
using (command.Connection.CreateConnectionScope())
{
using (var reader = command.ExecuteReader())
{
result = new Materializer<MyType>()
.Materialize(reader)
.ToList();
if (reader.NextResult() && reader.Read())
{
// This returns the total number of elements,
// (select COUNT(*) from #MyTable, ~15000 in my case)
total = reader.GetInt32(0);
}
}
}
由于 SP 可能会产生大量数据,.Materialize(reader) 仅将 10 个 first 元素返回到 result 变量中。
对于某些人来说,绝对无法更改此规则原因我在这里无法解释。
然而,在上面的示例中,total 是 SP 的结果总数,可能大于 10(在我的情况下约为 15000)并且效果很好。
我现在需要返回另一个结果,比如说
SELECT COUNT(*) from #MyTable WHERE colA = 'sample value'
显然,我不能在 C# 端进行,例如 var x = result.Where(x => x.Prop = "sample value").Count(),因为它只会搜索前 10 个结果,而 我希望它搜索整个数据集,即 ~ 15000 在这里。
我尝试添加
var total2 = reader.GetInt32(1);
但reader.GetInt32(1) 系统性地解雇了System.OutOfRangeException
在 C# 方面,我如何读取我的 SP 上的新 SELECT 语句返回的另一个结果?
【问题讨论】:
标签: c# sql sqldatareader sqlconnection sqlcommand