c# - 为 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
的方法来使用自己的方法?非常感谢任何帮助。提前致谢 :)
解决方案
请注意,尽管您可以利用数据提供者来创建对象,但您仍然需要考虑每个提供者的 SQL 差异。
如果你真的希望你的代码是不可知的,你最好使用实体框架、NHibertnate 或任何其他 ORM。
你永远不应该使用Task.Factory.StartNew
with async-await
。改为使用Task.Run
。但不适用于异步而不是同步,这也是一种不好的做法。
如果您使用DbCommand
而不是IDbCommand
您已经拥有ExecuteNonQueryAsync
.
推荐阅读
- .net - 枚举列表的验证消息
- angular - 资产/appconfig.production.json 找不到角天蓝色
- wpf - 设置 XamDataGrid 字段的最小值和最大值
- python - 将 ctypes args 从 c++ 翻译成 python
- android - RecyclerView:没有附加适配器;跳过布局 Surface 无效
- javascript - 如何从将自动发送的邮件中的工作表中获取信息
- ios - 升级到 Xcode 12 后的词法或预处理器问题
- windows - ZeroMemory 是相当于 null 终止缓冲区的窗口吗?
- php - 使用 php 获取 sql 数据并使用不同的名称显示在 html 表中?
- android - 如何自定义 IconButton 的颜色