2014-04-11 5 views
5

Ich habe eine ältere Anwendung, die ich schrieb, wo ich Microsoft.Practices.EnterpriseLibrary.Data verwendet, um Daten aus der DB zu erhalten. Ich habe kürzlich auf .NET 4.5 aktualisiert und wollte erwarten/async.erwarten/async Microsoft Practices Enterprise Bibliothek Daten

Ich sehe keine Methoden mit der Endung "Async" gemäß dem Benennungsstandard, selbst in der neuesten Version des Pakets. Ist es möglich, Warte/Async mit dieser ADO .NET-Bibliothek zu verwenden, ohne es manuell asynchron zu machen?

Antwort

6

konnte ich tatsächlich lesen Sie die Async Methoden finden. Ich habe nur an den falschen Stellen gesucht. Hier ist auf zwei Arten von der DB-Zugriff asynchron:

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

und wenn Sie erhalten Daten wollen:

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

können Sie verwenden GetFieldValueAsync<T> statt GetInt32 wenn Sie CommandBehavior.SequentialAccess mit großen Datenmengen verwenden. Aber in den meisten Fällen müssen Sie das wahrscheinlich nicht tun.

+0

Wie wäre es mit dem Öffnen der Verbindung? –

+2

Ich sehe diese Methoden tatsächlich nicht .. Ich habe die neuesten Daten der Enterprise-Bibliothek durch Nuget und immer noch nicht in der Lage, diese Methoden zu finden .. Kannst du mir die Version von ent lib wissen? – Bala

+1

ExecuteReaderAsync stammt nicht aus der Enterprise-Bibliothek - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.exectereaderasync(v=vs.110).aspx – StingyJack

0

Sie wahrscheinlich finden, dass es Methoden wie BeginXXX und EndXXXX hat, können Sie diese in Verbindung mit Task.Factory.FromAsync verwenden. Weitere Informationen here. Hier

ist ein Beispiel der Verwendung es eine Datei mit Task.Factory.FromAsync in Verbindung mit filestream.BeginRead und 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

Ich verwende eine ältere Version der EL, die Begin */End * -Methoden bietet, aber keine asynchronen Versionen. Einige einfache Erweiterungsmethoden vereinfachen die Lebensdauer:

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