【问题标题】:ExecuteReaderAsync() returns some rows at first but empty seconds later [closed]ExecuteReaderAsync() 首先返回一些行,但几秒钟后返回空[关闭]
【发布时间】:2021-02-09 09:19:37
【问题描述】:

我想要做的是使用 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”值进行了快速观察,它返回了一些行。

然后我关闭 QuickWatch 窗口,然后立即在“阅读器”上重新打开 Quickwatch 窗口,突然,结果为空。

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

【问题讨论】:

  • 向我们展示快速观看窗口的屏幕截图。我的猜测是快速手表无意中移动到下一行数据。
  • @mjwills 我已将图片添加到上面的问题中
  • 注意“值”列的状态。 “扩展结果视图将枚举...”看起来您已经枚举并耗尽了阅读器并且它不会自行重置
  • 另外,我刚刚验证了 SqlDataReader 和 DbDataReader 都没有调试器代理(这是有道理的,但我想确定一下),所以当你扩展它时枚举“真实”的东西
  • 是的 - 所以简短的回答是“不要在快速观察窗口中展开这些结果”。

标签: c# .net ado.net executereader


【解决方案1】:

注意值列的内容:

扩展结果将枚举 IEnumerable

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多