是否可以使用异步BeginExecuteReader迭代多个数据集

本文关键字:数据集 迭代 BeginExecuteReader 可以使 异步 是否 | 更新日期: 2023-09-27 18:22:33

我有一个长时间运行的存储过程,它返回多个结果。

我想异步迭代结果,并在结果准备好时获取结果(因为它们可用)。

ExecuteReaderAsync和一些WaitOne逻辑?(从未使用过这个,所以任何例子都值得赞赏)

这可能吗?

private IEnumerable<DataTable> validationResultSets(string MOName, DateTime StartDate, DateTime EndDate, string FilePath)
{
    DataTable d;
    using (SqlConnection conn =
    new SqlConnection(connString))
    {
        conn.Open();
        using (cmd = new SqlCommand("dbo.sp_ValidateAcceptanceFile", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@MOName",
                Value = MOName,
                SqlDbType = SqlDbType.VarChar,
                Size = 255
            });
            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@StartDate",
                Value = StartDate,
                SqlDbType = SqlDbType.DateTime
            });
            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@EndDate",
                Value = EndDate,
                SqlDbType = SqlDbType.DateTime
            });
            cmd.Parameters.Add(new SqlParameter
            {
                ParameterName = "@FilePath",
                Value = FilePath,
                SqlDbType = SqlDbType.VarChar,
                Size = 500
            });
            //IDataReader rdr = cmd.ExecuteReader();
            IDataReader rdr = cmd.BeginExecuteReader(); //??
            try
            {
                do
                {
                    d = new DataTable();
                    d.Load(rdr);
                    yield return d;
                } while (!rdr.IsClosed);
            }
            finally
            {
                rdr.Close();
                rdr.Dispose();
            }
        }
    }
}

是否可以使用异步BeginExecuteReader迭代多个数据集

您正在混合概念。返回多个结果的过程与MARS没有任何关系。返回多个结果的过程可以异步调用,请注意,一旦结果的第一个片段从服务器返回,异步调用就会完成,从那时起,您可以像同步代码中一样读取结果。