QueriesTableAdapter CommandTimeout

时间:2013-09-30 17:40:12

标签: asp.net sql-server ado.net

我有一个QueriesTableAdapter,它带有一个需要很长时间才能执行的Update存储过程。我正在尝试增加从中调用存储过程的查询表适配器的命令超时属性。

存储过程是一个维护例程,一个进程通过Web服务不经常调用。

请注意:它是QueriesTableAdapter而不是TableAdapter,我使用的是.net 4.5 VS 2012

在我的DAL背后的代码中,我添加了以下内容:

Namespace mbr_AccountTableAdapters
    Partial Public Class QueriesTableAdapter

        ''' <summary>
        ''' Sets the commant timeout.
        ''' Set to 0 to specify the longest timout value supported by the db.
        ''' </summary>
        Public WriteOnly Property CommandTimeout As Integer
            Set(value As Integer)
                If Not IsNothing(Me._commandCollection) Then
                    For Each cmd As System.Data.IDbCommand In Me._commandCollection
                        cmd.CommandTimeout = value
                    Next
                End If
            End Set
        End Property

    End Class
End Namespace

然后我可以使用BLL中的以下代码运行我的存储过程:

Dim rows As Integer = 0 'number of affected rows

Using myQTA As New DAL.mbr_AccountTableAdapters.QueriesTableAdapter

    'increase the command timeout:
    myQTA.CommandTimeout = 0 '0 = larget value possible

    Dim queryResult As Object
    queryResult = myQTA.usrsp_mbr_account_CleanupInactive()
    If Not IsNothing(queryResult) Then
        rows = Convert.ToInt32(queryResult)
    End If

End Using

我收到以下错误:

[Win32Exception(0x80004005):等待操作超时]

[SqlException(0x80131904):超时已过期。操作完成之前经过的超时时间或服务器没有响应。]


请注意,查询有效 - 连接或任何其他错误都没有问题。如果我将需要处理的数据量减少到一小部分数据,则查询运行时没有错误。

问题是需要的时间超过30秒。

查询在30秒后完全超时。

将“连接超时= 90”添加到web.config中的数据库连接字符串没有任何区别,它在30秒后仍然超时。

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题。

_commandCollection始终为NULL,因此永远不会设置CommandTimeout值。

我们必须先调用InitCommandCollection()来初始化命令集合,然后我们才能设置CommandTimeout值:

我将代码更改为:

Public WriteOnly Property CommandTimeout As Integer
    Set(value As Integer)

        'initialize the collection first:
        If IsNothing(Me._commandCollection) Then
            Me.InitCommandCollection()
        End If

        If Not IsNothing(Me._commandCollection) Then
            For Each cmd As System.Data.IDbCommand In Me._commandCollection
                cmd.CommandTimeout = value
            Next
        End If
    End Set
End Property

它现在按预期工作,我可以为存储过程设置自定义超时值。

我希望这些信息有助于其他人。