【问题标题】:Timeout Expire on INSERT QueryINSERT 查询超时过期
【发布时间】:2009-03-19 14:43:59
【问题描述】:

我正在尝试在事务中使用简单的 INSERT 查询在表中插入一行。它在 SQL Server 中运行良好,但我无法使用我的业务对象插入数据。

我使用以下命令调用 SELECT 查询:

Using cm As New SqlCommand
    With cm
        .Connection = tr.Connection
        .Transaction = tr
        .CommandType = CommandType.Text
        .CommandText = Some Select Query
        .ExecuteScalar()
         '' Do something

        .CommandText = Insert Query
        .ExecuteNonQuery()
    End With
End Using

我在“.ExecuteNonQuery()”行收到超时期限过期错误。

此时,任何其他 DML 查询都运行良好。

谁能告诉我原因?

【问题讨论】:

标签: vb.net sql-server-2005


【解决方案1】:

Management Studio 将其连接设置为不超时,这可以解释为什么它在那里工作。您可以在代码中通过将连接的 .Timeout 属性设置为 0 来执行此操作。但是,除非您真的是认真的,否则不建议这样做。

相反,我们需要弄清楚是什么花费了这么长时间。 Management Studio 查询是否需要很长时间才能完成?它可以等待事务提交吗?您能否分析一下应用程序在哪里花费时间?

【讨论】:

  • SqlConnection.ConnectionTimeout 属性是只读的。另外,我还没有调用 Transaction.Commit()。它将在此 INSERT 查询之后调用。有趣的是,我有另一个类似的业务对象,其中 INSERT 正在正确执行。
【解决方案2】:

您的查询似乎使用了错误的查询计划。尝试将 ARITHABORT 设置为 ON,这应该会绕过查询计划:

Dim arithabortCmd As New SqlCommand("SET ARITHABORT ON", cn)
arithabortCmd.ExecuteNonQuery()

我会通过在数据库上执行此 SQL 来确保更新数据库索引:

-- Execute this to rebuild all for a given database. Replace the <databasename> after EXEC.
EXEC <databasename>..sp_MSforeachtable @command1='DBCC DBREINDEX (''*'')', @replacechar='*'

【讨论】:

  • SET ARITHABORT ON 照你说的做?参考...?
猜你喜欢
  • 2013-08-31
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2016-11-28
  • 2020-01-05
  • 2015-12-13
相关资源
最近更新 更多