ExecuteReaderAsync() returns 一开始是一些行,但几秒钟后是空的

ExecuteReaderAsync() returns some rows at first but empty seconds later

我想做的是使用 ado.net 调用存储过程并获取其结果。我尝试在 ssms 中执行存储过程并且它工作正常。

但是当我尝试通过代码 运行 它时,结果是空的,所以我尝试调试,这是我的问题。

下面是我正在尝试调试的代码。

using (SqlConnection sql = new SqlConnection(_connString)) 
        {
            using (SqlCommand cmd = new SqlCommand("GetDdmhData", sql))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@requestDate", dateReport.Value.Date.ToString("yyyy-MM-dd")));
                
                await sql.OpenAsync();

                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    while (await reader.ReadAsync())
                    {
                        
                        var test = "";
                    }
                }                    
            }
        }

我有一个奇怪的问题。我将断点放在下面的语句

while (await reader.ReadAsync())

断点命中后,我对 'reader' 值进行了快速观察,它 returns 显示了一些行。

然后我关闭了 QuickWatch window,然后在'reader' 上直接打开 Quickwatch window,突然,结果为空。

有人可以向我解释为什么会发生这种情况以及如何解决这个问题吗?

注意值列的内容:

Expanding the results will enumerate the IEnumerable

您导致数据 reader 枚举其内容。大多数枚举器不会重置,因此当您再次展开它时,您已经用尽了它,因此没有结果。 SqlDataReader 没有调试器代理,因此您正在迭代实际的 reader 及其结果。

请注意,这不是数据 reader 所独有的。任何可枚举都可能发生这种情况。这也是为什么某些产品(如 ReSharper,但可能是 VS IDE 本身?)对 IEnumerable 的多个枚举发出警告的部分原因。您可能会耗尽它,或者更糟的是,您可能会导致多次往返于源(例如 LINQ 查询)。这种情况下的数据 reader 会自行耗尽; DbEnumerator 调用 Read,推进 reader 直到没有更多数据,然后 reader 不会重置。