Реализация Async ExecuteNonQuery () для IDBCommand против SqlCommand.ExecuteNonQueryAsync - PullRequest
2 голосов
/ 29 апреля 2019

Я использую IDBCommand для своего уровня базы данных, чтобы переключиться на других поставщиков баз данных, кроме SqlDataProvider.

SqlCommand имеет все асинхронные методы, такие как ExecuteNonQueryAsync, но IDBCommand не содержит асинхронный метод.

В будущем нам может понадобиться переключиться на другого поставщика данных, кроме Sql, я просто не могу использовать SqlCommand напрямую.

Я просто думаю реализовать свои собственные версии Async. Будут ли проблемы с производительностью, если я реализую свою собственную? Или лучше использовать реализованные в Microsoft асинхронные методы, доступные для SqlCommand объекта?

Следующим способом я реализовал свои Async методы. Следующее является синхронным:

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

Ниже приведена Async версия:

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

Обратите внимание, что обработка исключений будет выполняться вызывающим слой. * * тысяча двадцать пять

Может кто-нибудь дать мне правильное направление? Это правильный способ сделать асинхронную операцию, или я должен использовать Microsoft SqlCommand, чтобы использовать свои собственные методы? Любая помощь очень ценится. Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Помните, что, хотя вы можете использовать поставщиков данных для создания своих объектов, вам все равно придется учитывать различия в SQL для каждого поставщика.

Если вы действительно хотите, чтобы ваш код был независимым, вылучше с Entity Framework, NHibertnate или любым другим ORM.

Вы никогда не должны использовать Task.Factory.StartNew с async-await.Вместо этого используйте Task.Run.Но не для асинхронной синхронизации, что также является плохой практикой.

Если вы работаете с DbCommand вместо IDbCommand, у вас уже есть ExecuteNonQueryAsync.

1 голос
/ 29 апреля 2019

Вы можете использовать абстрактные классы внутри пространства имен System.Data.Common.У них есть асинхронные методы.Например:

DbCommand.ExecuteNonQueryAsync()

System.Data.SqlClient.SqlCommand наследуется от этого базового класса, и, надеюсь, другие поставщики данных также делают это.

1 голос
/ 29 апреля 2019

Я предлагаю вам использовать Dapper . Нет причин писать весь этот стандартный код ADO.NET и беспокоиться о том, можете ли вы сменить поставщика. Он также поддерживает асинхронные операции по всем направлениям.

Dapper не имеет конкретных деталей реализации БД, он работает во всех Поставщики .NET ADO, включая SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL и SQL Server.

Учебник

https://dapper -tutorial.net / асинхронный

...