2 votes

Implémentation de la fonction Async ExecuteNonQuery() pour IDBCommand vs SqlCommand.ExecuteNonQueryAsync

J'utilise IDBCommand pour ma couche de base de données afin de passer à d'autres fournisseurs de base de données que le SqlDataProvider .

SqlCommand a toutes les méthodes asynchrones comme ExecuteNonQueryAsync mais IDBCommand ne contient pas de méthode asynchrone.

À l'avenir, nous pourrions avoir besoin de passer à un autre fournisseur de données autre que le Sql je ne peux pas utiliser SqlCommand directement.

Je pense juste à implémenter mes propres versions asynchrones. Y aurait-il un problème de performance si je mettais en œuvre mes propres versions ? Ou est-il préférable d'utiliser les méthodes asynchrones implémentées par Microsoft, qui sont disponibles pour les applications de l'entreprise ? SqlCommand objet ?

De la manière suivante, j'ai mis en œuvre mon Async méthodes. Ce qui suit est une méthode Synchronous :

public int ExecuteNonQuery(CommandType commandType, string commandText)
{
    PrepareCommand(commandType, commandText);
    var noOFRowsAffected = _dbCommand.ExecuteNonQuery();
    SetParameters(_dbCommand.Parameters);
    return noOFRowsAffected;
 }

Le texte suivant est le Async version :

public async Task<int> ExecuteNonQueryAsync(CommandType commandType, string commandText)
{
    PrepareCommand(commandType, commandText);

    var noOFRowsAffected = await Task.Factory.StartNew(() =>
    {
        return _dbCommand.ExecuteNonQuery();
    });

    SetParameters(_dbCommand.Parameters);
    return noOFRowsAffected;
}

Veuillez noter que la gestion des exceptions sera assurée par l'appelant. appelant.

Quelqu'un peut-il me donner la bonne direction ? Est-ce une façon correcte de faire l'opération asynchrone ou dois-je utiliser l'implémentation microsoft ? SqlCommand d'utiliser ses propres méthodes ? Toute aide est vraiment appréciée. Merci d'avance :)

2voto

Paulo Morgado Points 1015

Attention, bien que vous puissiez utiliser des fournisseurs de données pour créer vos objets, vous devrez tenir compte des différences dans le SQL de chaque fournisseur.

Si vous voulez vraiment que votre code soit agnostique, il vaut mieux utiliser Entity Framework, NHibertnate ou tout autre ORM.

Vous ne devez jamais utiliser Task.Factory.StartNew con async-await . Utilisez Task.Run à la place. Mais pas pour l'asynchronisme sur la synchronisation, qui est également une mauvaise pratique.

Si vous travaillez avec DbCommand au lieu de IDbCommand vous avez déjà ExecuteNonQueryAsync .

1voto

William Points 444

Je vous suggère d'utiliser Dapper . Il n'y a aucune raison d'écrire tout ce code ADO.NET passe-partout et de s'inquiéter de savoir si vous pouvez changer de fournisseur. Il prend également en charge les opérations asynchrones dans tous les cas.

Dapper n'a pas de détails d'implémentation spécifiques à la DB, il fonctionne sur tous les fournisseurs ADO de NET ADO, y compris SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL et SQL Server.

Tutoriel

https://dapper-tutorial.net/async

1voto

Theodor Zoulias Points 1088

Vous pouvez utiliser les classes abstraites à l'intérieur de la System.Data.Common espace de noms. Ils disposent de méthodes asynchrones. Par exemple :

DbCommand.ExecuteNonQueryAsync()

El System.Data.SqlClient.SqlCommand hérite de cette classe de base, et nous espérons que les autres fournisseurs de données en feront autant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X