为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()相关的知识,希望对你有一定的参考价值。

我正在使用IDBCommand作为我的数据库层,以便切换到除SqlDataProvider之外的其他数据库提供程序。

SqlCommand具有所有异步方法,如ExecuteNonQueryAsync,但IDBCommand不包含异步方法。

将来我们可能需要切换到Sql以外的其他数据提供者,我不能直接使用SqlCommand

我只是想实现自己的Async版本。如果我自己实施,会不会有任何性能问题?或者更好地使用可用于SqlCommand对象的microsoft实现的异步方法?

通过以下方式,我实现了我的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来使用自己的方法?任何帮助都非常感谢。提前致谢 :)

答案

您可以在System.Data.Common名称空间中使用抽象类。他们确实有异步方法。例如:

DbCommand.ExecuteNonQueryAsync()

System.Data.SqlClient.SqlCommand继承自这个基类,希望其他数据提供者也这样做。

另一答案

请注意,虽然您可以利用数据提供程序来创建对象,但您仍需要考虑每个提供程序的SQL差异。

如果您真的希望您的代码不可知,那么您最好使用Entity Framework,NHibernate或任何其他ORM。

你永远不应该使用Task.Factory.StartNewasync-await。请改用Task.Run。但不是异步过度同步,这也是一种不好的做法。

如果你使用DbCommand而不是IDbCommand你已经有ExecuteNonQueryAsync

另一答案

我建议你使用Dapper。没有理由编写所有样板ADO.NET代码并担心您是否可以更改提供程序。它还支持全面的异步操作。

Dapper没有特定于DB的实现细节,它适用于所有.NET ADO提供程序,包括SQLite,SQL CE,Firebird,Oracle,mysql,PostgreSQL和SQL Server。

教程

https://dapper-tutorial.net/async

以上是关于为IDBCommand和SqlCommand.ExecuteNonQueryAsync实现异步ExecuteNonQuery()的主要内容,如果未能解决你的问题,请参考以下文章

向 IDbCommand 添加参数

多行插入的 IDBCommand 参数

将参数传递给 mySQL 数据库的 IdbCommand

2017.11.01 ExecuteNonQueryExecuteScalarExecuteDataSetFillDataSet 流程

设计模式-装饰器模式

将文件和数据转换为 outputStream 并将 inputStream 转换为文件和数据