【问题标题】:What connection does a SqlCommandBuilder use to generate queries?SqlCommandBuilder 使用什么连接来生成查询?
【发布时间】:2011-01-10 15:42:20
【问题描述】:

我问是因为当我使用 SqlCommandBuilder 中的 GetUpdateCommand()GetInsertCommand() 时,生成的 SqlCommand 设置了其 Connection 成员,但处于关闭状态。我想知道它使用什么连接,因为我在这个对象中看不到任何连接成员,并且SqlCommandBuilder.DataAdapter.SelectCommand 中的连接是打开的(更新/删除/插入命令属性为空)。

在运行GetUpdateCommand()GetInsertCommand() 之前,我应该在哪里检查连接状态?或者如果它关闭了,我应该只打开它们的内部连接吗?

顺便说一句,我将 .Net 4 与 SQL Server 2008 一起使用。

【问题讨论】:

  • 您确定它需要连接吗?它有(需要)来自 SELECT 的元数据
  • 是的,我确定,因为当我执行使用此方法生成的命令时,出现异常(“ExecuteNonQuery 需要打开且可用的连接。连接的当前状态为关闭”)。

标签: c# .net sql database-connection


【解决方案1】:

AFAIK 它使用SqlCommandBuilder.DataAdapter.SelectCommand 的连接来创建新命令,但是它仅在您第一次尝试访问该命令时完成。第一次尝试后,命令实例被保留,并且只重新生成其命令文本。

【讨论】:

  • 是的,它的真正调用,即 GetInsertCommand 多次将导致我在先前返回的 SqlCommand 实例上更改命令文本。但这仍然意味着最终生成的命令将使用来自 SqlCommandBuilder.DataAdapter.SelectCommand 的连接
  • 好的,但这并不能解释不同的连接状态。无论如何,我通过重新设置命令的连接绕过了这个问题,这似乎到目前为止有效。
【解决方案2】:

在您的SqlCommandBuilder 上调用GetXXXCommand 时,它将在内部为DataAdapter (DataAdapter.SelectCommand.Connection.CreateCommand()) 上的连接集创建一个新命令。这意味着构建器创建的所有命令的连接应该相同,并且打开/关闭状态也应该相同。

您的代码是什么样的,它决定了状态在SqlCommandBuilder.DataAdapter.SelectCommand.Connection 上是打开的,但不是在SqlCommandBuilder.GetInsertCommand().Connection 上!?

【讨论】:

  • 我只是在调用 GetUpdateCommand() 之后在调试器中查看它。正如问题的 cmets 中所解释的,当我在生成的命令上运行 ExecuteNonQuery() 时调试错误时,我意识到了这一点。
  • 我不会在这件事上隐含地信任调试器,而是进行一些真正的代码测试......或者在执行任何针对它的操作之前确保连接是打开的。
  • 性能方面,我认为使用已经打开的连接比打开关闭的连接更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2015-05-09
  • 2012-06-16
  • 2013-08-23
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多