为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.StartNew
与async-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()的主要内容,如果未能解决你的问题,请参考以下文章
2017.11.01 ExecuteNonQueryExecuteScalarExecuteDataSetFillDataSet 流程