首页 > 解决方案 > 为 IDBCommand 与 SqlCommand.ExecuteNonQueryAsync 实现异步 ExecuteNonQuery()

问题描述

我正在使用IDBCommand我的数据库层来切换到其他数据库提供程序,而不是SqlDataProvider.

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

将来我们可能需要切换到除 之外的另一个数据提供者Sql,我只是不能SqlCommand直接使用。

我只是想实现我自己的异步版本。如果我实施自己的,会有任何性能问题吗?还是使用微软实现的可用于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;
}

请注意,异常处理将由调用层处理。

谁能给我正确的方向?这是进行异步操作的正确方法还是我应该使用微软实现SqlCommand的方法来使用自己的方法?非常感谢任何帮助。提前致谢 :)

标签: c#async-awaitado.nettask-parallel-library

解决方案


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

如果你真的希望你的代码是不可知的,你最好使用实体框架、NHibertnate 或任何其他 ORM。

你永远不应该使用Task.Factory.StartNewwith async-await。改为使用Task.Run。但不适用于异步而不是同步,这也是一种不好的做法。

如果您使用DbCommand而不是IDbCommand您已经拥有ExecuteNonQueryAsync.


推荐阅读