检测 SqlDataAdapter 填充方法何时完成

Posted

技术标签:

【中文标题】检测 SqlDataAdapter 填充方法何时完成【英文标题】:Detect when SqlDataAdapter fill method completes 【发布时间】:2020-04-11 20:14:58 【问题描述】:

我有一个全局 SqlDataAdapter,它为多个 SqlCommand 提供服务。问题有时是 SqlDataAdapter 填充方法会引发错误提示

There is already an open DataReader associated with this Command...

我想知道是否存在某种方法可以知道填充方法何时仍在执行?

我听说 SqlDataAdapter 在内部使用 DataReader

可以得到DataReader吗?

【问题讨论】:

【参考方案1】:

“我有一个全局 SqlDataAdapter” - 那是你的错误。摒弃这个概念,并在您想要使用的时候创建一个 DataAdapter。将其放入using 语句中,这样您就不会忘记将其丢弃。

另外,如果您正在缓存连接并手动打开关闭它们,也不要这样做 - 只需给适配器(您当场制作的)一个 SQL 字符串和一个连接字符串,然后让它建立连接并命令对象。您唯一可能想要创建一个连接并自己打开它的情况是,如果您有很多操作要使用不同的适配器按顺序执行,可能作为事务的一部分。不要忘记打开和关闭连接并不一定与数据库建立 TCP 连接(慢) - 它是从连接池中租用并返回当前连接且可用的连接,并且是一个微不足道的操作

你越是尝试和微观管理它,它就会变得越糟糕,并且试图四处晃动,检测到这一点并等待那是 a) 不必要的,b) 试图在你自己画的角落里工作的一团糟into , c) 将提供不合标准的 UI 体验。

【讨论】:

我已经声明了一个本地 SqlDataAdapter,但仍然会出现错误 是的,我设置了 SqlDataAdapter SelectCommand 属性,但在函数内部声明了 SqlDataAdapter。 并且错误说“这个命令已经有一个打开的数据读取器”... 所以,回到我提到的“创建一个新的数据适配器,并给它一个 SQL 字符串和一个连接字符串并让它创建命令和连接”的那一点——如果你这样做了您不会在多个地方使用相同的命令并且已经拥有一个打开的数据阅读器 在我看来,错误消息不正确,因为我使用了不同的命令对象。可能连接不支持同时执行多个命令。

以上是关于检测 SqlDataAdapter 填充方法何时完成的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill - 异步方法

为啥 SqlDataAdapter 的填充不允许我添加与外观具有相同行值的行?

如何使用 SqlDataReader 像使用 SqlDataAdapter 一样快地填充 DataTable?

SqlDataAdapter 未填充 DataTable

如何在 where 子句上基于 SqlCommand 或 SqlDataAdapter 填充 datagridview? SqlDataAdapter 不适用于哪里?

C# SqlDataAdapter 不填充数据集