System.Data.IDbCommand和异步执行?

Ste*_*ger 10 c# sql asynchronous interface sqlclient

System.Data.SqlClient.SqlCommand有方法

BeginExecuteNonQuery
BeginExecuteReader
BeginExecuteXmlReader
Run Code Online (Sandbox Code Playgroud)

EndExecuteNonQuery
EndExecuteReader
EndExecuteXmlReader
Run Code Online (Sandbox Code Playgroud)

用于异步执行.

System.Data.IDbCommand只有

ExecuteNonQuery
ExecuteReader
ExecuteXmlReader
Run Code Online (Sandbox Code Playgroud)

它们仅用于同步操作.

是否有任何异步操作接口?
另外,为什么没有BeginExecuteScalar?

bin*_*nki 7

我建议DbCommand在使用数据库API时将它们和朋友视为接口.对于推广了多种数据库提供的API的缘故,DbCommand达到一样好IDbCommand-或者可以说,更好的,因为它包括了新的技术,比如适当的await能够Task *Async()会员.

MS无法添加任何具有新功能的新方法IDbCommand.如果他们要添加一个方法IDbCommand,那么这是一个重大改变,因为任何人都可以在他们的代码中自由地实现该接口,并且MS已经花费了很多精力来保持框架中的ABI和API兼容性.如果他们在.net版本中扩展接口,之前工作的客户代码将停止编译,并且未重新编译的现有程序集将开始遇到运行时错误.此外,他们不能通过扩展方法添加适当的*Async()Begin*()方法,而不会DbCommand在幕后进行丑陋的投射(这本身就是一种不好的做法,打破了类型安全性并且不必要地引入了动态运行时强制转换).

另一方面,MS可以在DbCommand不破坏ABI的情况下添加新的虚拟方法.向基类添加新方法可能会被视为破坏API(编译时,不像运行时那样中断),因为如果继承DbCommand并添加了具有相同名称的成员,则会开始收到警告CS0108:' member1'隐藏继承的成员'member2'.如果要隐藏,请使用new关键字.).因此,DbCommand可以获得新功能,对遵循良好实践的代码消耗影响最小(例如,只要不对类型系统起作用并且使用类似的方法调用方法,大多数东西将继续工作myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)).

MS可能用于支持喜欢接口的人的可能策略是引入具有类似名称的新接口IAsyncDbCommandDbCommand实现它们.他们没有这样做.我不知道为什么,但他们可能没有这样做,因为它会增加复杂性,直接消费的替代方案DbCommand为消费界面提供了大部分好处,但缺点很少.也就是说,这将是很少回报的工作.


Jar*_*ore 3

IDbCommand没有开始/结束异步方法,因为它们在 ADO.NET 的原始 .NET 1.1 版本中尚不存在,并且当在 .NET 2.0 中添加异步方法时,将这些方法添加到IDbCommand(向接口添加成员对于该接口的实现者来说是一个重大更改)。

我不知道为什么BeginExecuteScalar不存在,但它可以作为包装BeginExecuteReader. 无论如何,在 .NET 4.5 中,我们现在有了ExecuteScalarAsync更易于使用的版本。

  • 哦,你是说 [`SqlCommand.ExecuteScalarAsync()`](https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalarasync%28v=vs.110%29.aspx )。我懂了。 (3认同)