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 不会重置。
我想做的是使用 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 不会重置。