为 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.
教程
请注意,虽然您可以利用数据提供者来创建您的对象,但您仍然需要考虑每个提供者的 SQL 差异。
如果你真的希望你的代码是不可知的,你最好使用 Entity Framework、NHibertnate 或任何其他 ORM。
你不应该将 Task.Factory.StartNew
与 async-await
一起使用。请改用 Task.Run
。但不是异步过度同步,这也是一种不好的做法。
如果您使用 DbCommand
而不是 IDbCommand
,您已经有 ExecuteNonQueryAsync
.
您可以在 System.Data.Common
命名空间中使用抽象 classes。他们确实有异步方法。例如:
DbCommand.ExecuteNonQueryAsync()
System.Data.SqlClient.SqlCommand
继承自该基础 class,希望其他数据提供者也这样做。
我正在为我的数据库层使用 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.
教程
请注意,虽然您可以利用数据提供者来创建您的对象,但您仍然需要考虑每个提供者的 SQL 差异。
如果你真的希望你的代码是不可知的,你最好使用 Entity Framework、NHibertnate 或任何其他 ORM。
你不应该将 Task.Factory.StartNew
与 async-await
一起使用。请改用 Task.Run
。但不是异步过度同步,这也是一种不好的做法。
如果您使用 DbCommand
而不是 IDbCommand
,您已经有 ExecuteNonQueryAsync
.
您可以在 System.Data.Common
命名空间中使用抽象 classes。他们确实有异步方法。例如:
DbCommand.ExecuteNonQueryAsync()
System.Data.SqlClient.SqlCommand
继承自该基础 class,希望其他数据提供者也这样做。