2014-04-11 17 views
5

Ho una vecchia applicazione che ho scritto dove ho usato Microsoft.Practices.EnterpriseLibrary.Data per ottenere dati dal DB. Ho recentemente aggiornato a .NET 4.5 e ho voluto approfittare di await/async.await/async Microsoft Practices Dati libreria aziendale

Non vedo alcun metodo che termina in "Async" secondo lo standard di denominazione, anche nella versione più recente del pacchetto. È possibile utilizzare await/async con questa libreria di ADO .NET senza renderlo manualmente asincrono?

risposta

6

Io in realtà era in grado di trovare i metodi asincroni. Stavo solo cercando nei posti sbagliati. Ecco due modi comuni di accesso al DB in modo asincrono:

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

e quando si desidera ottenere i dati:

 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); 
       } 
      } 
     } 

È possibile utilizzare GetFieldValueAsync<T> invece di GetInt32 se si utilizza CommandBehavior.SequentialAccess con grandi quantità di dati. Ma, per la maggior parte dei casi, probabilmente non hai bisogno di farlo.

+0

Che dire di aprire la connessione? –

+2

In realtà non vedo questi metodi ora .. Ho ottenuto i dati più recenti della libreria aziendale tramite Nuget e ancora non sono in grado di trovare questi metodi ... Puoi farmi sapere la versione di ent lib? – Bala

+1

ExecuteReaderAsync non appartiene alla libreria aziendale: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereaderasync(v=vs.110).aspx – StingyJack

0

probabilmente scoprirete che ha metodi come BeginXXX e EndXXXX, è possibile utilizzare quelli in combinazione con Task.Factory.FromAsync. Maggiori informazioni here.

Ecco un esempio di utilizzarlo per leggere un file utilizzando Task.Factory.FromAsync in collaborazione con filestream.BeginRead e filestream.EndRead

private async Task<string> ReadFileAsync() 
{ 
    var fileStream = File.OpenRead("..\\..\\..\\test.txt"); 
    var buffer = new byte[1024]; 

    await Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, buffer.Length, null); 

    return System.Text.Encoding.ASCII.GetString(buffer); 
} 
6

Sto usando una versione precedente dell'EL che offre i metodi Begin */End *, ma non le versioni asincrone. Alcuni semplici metodi di estensione semplificano la vita:

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); 
} 
Problemi correlati