系统.Data.SqlClient.SqlCommand
有方法
BeginExecuteNonQuery
BeginExecuteReader
BeginExecuteXmlReader
and
EndExecuteNonQuery
EndExecuteReader
EndExecuteXmlReader
用于异步执行。
系统.数据.IDb命令
只有
ExecuteNonQuery
ExecuteReader
ExecuteXmlReader
仅适用于同步操作。
有异步操作的接口吗?
另外,为什么没有 BeginExecuteScalar ?
我建议治疗DbCommand
及其朋友在使用数据库 API 时就好像它们是接口一样。为了在各种数据库提供者上通用 API,DbCommand
达到同样的效果IDbCommand
——或者可以说更好,因为它包括更新的技术,例如适当的技术await
able Task
*Async()
成员。
MS 无法添加任何具有新功能的新方法IDbCommand
。如果他们要添加一个方法IDbCommand
,这是一个重大变化,因为任何人都可以在他们的代码中自由地实现该接口,并且 MS 为保持框架中的 ABI 和 API 兼容性付出了很大的努力。如果他们在 .net 版本中扩展了接口,以前有效的客户代码将停止编译,并且未重新编译的现有程序集将开始遇到运行时错误。此外,他们无法添加适当的*Async()
or Begin*()
通过扩展方法的方法,无需进行丑陋的转换DbCommand
在幕后(这本身就是一种不好的做法,破坏了类型安全并不必要地引入动态运行时转换)。
另一方面,MS可以添加新的虚拟方法DbCommand
不破坏 ABI。向基类添加新方法可能会被视为破坏 API(编译时,不像运行时那样破坏 API),因为如果您继承了DbCommand
并且添加了同名的成员,您将开始收到警告CS0108:“member1”隐藏继承的成员“member2”。如果打算隐藏,请使用 new 关键字。 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0108)。因此,DbCommand
可以获得新功能,对使用遵循良好实践的代码影响最小(例如,只要不针对类型系统工作,大多数东西就会继续工作,并使用类似的方法调用方法myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)
).
MS 可以用来支持喜欢界面的人们的一个可能策略是引入新的界面,其名称如下IAsyncDbCommand
并有DbCommand
实施它们。他们还没有这样做。我不知道为什么,但他们可能没有这样做,因为这会增加复杂性和直接消耗的替代方案DbCommand
为消费接口提供了大部分好处,但缺点很少。也就是说,这将是一项回报甚微的工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)