我有一个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秒后仍然超时。
答案 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
它现在按预期工作,我可以为存储过程设置自定义超时值。
我希望这些信息有助于其他人。