await/async Microsoft Practices企业库数据

Scu*_*eve 8 c# ado.net enterprise-library async-await asp.net-4.5

我有一个较旧的应用程序,我在那里用来Microsoft.Practices.EnterpriseLibrary.Data从数据库中获取数据.我最近升级到.NET 4.5并希望利用await/async.

根据命名标准,我没有看到任何以"Async"结尾的方法,即使在最新版本的软件包中也是如此.是否可以在不手动使其异步的情况下对此ADO .NET库使用await/async?

Eri*_*ick 10

我正在使用提供Begin*/End*方法的旧版EL,但不提供异步版本.一些简单的扩展方法简化了生活

public static async Task<IDataReader> ExecuteReaderAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<IDataReader>.Factory.FromAsync(database.BeginExecuteReader, database.EndExecuteReader, command, null);
}

public static async Task<object> ExecuteScalarAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<object>.Factory.FromAsync(database.BeginExecuteScalar, database.EndExecuteScalar, command, null);
}

public static async Task<XmlReader> ExecuteXmlReaderAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<XmlReader>.Factory.FromAsync(database.BeginExecuteXmlReader, database.EndExecuteXmlReader, command, null);
}

public static async Task<int> ExecuteNonQueryAsync(this SqlDatabase database, DbCommand command)
{
    return await Task<int>.Factory.FromAsync(database.BeginExecuteNonQuery, database.EndExecuteNonQuery, command, null);
}
Run Code Online (Sandbox Code Playgroud)


Scu*_*eve 6

我实际上能够找到异步方法.我只是在寻找错误的地方.以下是异步访问数据库的两种常用方法:

        var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection);
        using (var cmd = db.GetStoredProcCommand("SprocName", parameterA))
        {
            await cmd.ExecuteNonQueryAsync();
        }
Run Code Online (Sandbox Code Playgroud)

当你想获得数据时:

        var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection);
        using (var cmd = db.GetStoredProcCommand("SprocName", parameterA, parameterB, parameterC))
        {
            using (var dr = await cmd.ExecuteReaderAsync())
            {
                while (await dr.ReadAsync())
                {
                    return dr.GetInt32(0);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

您可以使用GetFieldValueAsync<T>而不是GetInt32使用CommandBehavior.SequentialAccess大量数据.但是,对于大多数情况,您可能不需要这样做.

  • 我实际上现在没有看到这些方法..我通过Nuget获得了最新的企业库数据,但仍然无法找到这些方法.你能让我知道ent lib的版本吗? (2认同)
  • ExecuteReaderAsync不是来自企业库 - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereaderasync(v=vs.110).aspx (2认同)