为 IDBCommand 与 SqlCommand.ExecuteNonQueryAsync 实施 Async ExecuteNonQuery()

Implementing Async ExecuteNonQuery() for IDBCommand vs SqlCommand.ExecuteNonQueryAsync

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

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

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

我只是想实现我自己的异步版本。如果我自己实现,会有性能问题吗?或者最好使用可用于 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;
}

Please note that exception handling would be handled by the calling layer.

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

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

Dapper has no DB specific implementation details, it works across all .NET ADO providers including SQLite, SQL CE, Firebird, Oracle, MySQL, PostgreSQL and SQL Server.

教程

https://dapper-tutorial.net/async

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

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

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

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

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

DbCommand.ExecuteNonQueryAsync()

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