jjzjj

c# - System.Data.IDbCommand 和异步执行?

coder 2024-06-03 原文

系统.数据.SqlClient.SqlCommand 有方法

BeginExecuteNonQuery
BeginExecuteReader
BeginExecuteXmlReader

EndExecuteNonQuery
EndExecuteReader
EndExecuteXmlReader

用于异步执行。

System.Data.IDb命令 只有

ExecuteNonQuery
ExecuteReader
ExecuteXmlReader

仅用于同步操作。

有异步操作的接口(interface)吗?
另外,为什么没有 BeginExecuteScalar ?

最佳答案

我建议在使用数据库 API 时将 DbCommand 及其 friend 视为接口(interface)。为了在各种数据库提供程序上泛化 API,DbCommand 的实现与 IDbCommand 一样好——或者可以说,更好,因为它包含更新的技术,例如适当的 awaitable Task *Async() 成员。

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

另一方面,MS 可以在不破坏 ABI 的情况下向 DbCommand 添加新的虚拟方法。向基类添加新方法可能会破坏 API(编译时,不像运行时那样破坏),因为如果您继承了 DbCommand 并添加了一个具有相同名称的成员,那么您我会开始收到警告 CS0108: 'member1' hides inherited member 'member2'. Use the new keyword if hiding was intended. ).因此,DbCommand 可以获得新功能,而对使用遵循良好实践的代码的影响最小(例如,只要它不针对类型系统和调用方法使用某些东西,大多数东西都会继续工作像 myCommand.GetType().GetMethods()[3].Invoke(myCommand, …)).

MS 可以用来支持喜欢接口(interface)的人的一种可能策略是引入名称为 IAsyncDbCommand 的新接口(interface),并让 DbCommand 实现它们。他们没有这样做。我不知道为什么,但他们可能没有这样做,因为这会增加复杂性,而直接使用 DbCommand 的替代方案提供了使用接口(interface)的大部分好处,但缺点很少。也就是说,这会带来很少的返回。

关于c# - System.Data.IDbCommand 和异步执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111807/

有关c# - System.Data.IDbCommand 和异步执行?的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  5. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐