当表为空时,Tableadapter.fill超时

时间:2011-08-24 17:57:20

标签: vb.net visual-studio-2010 sql-server-2008 timeout tableadapter

我有一个View,我正试图用它来填充TableAdapter。在我的代码中,我第一次正确填充表适配器,过滤我的bindingsource并使用datarowviews循环遍历数据行并执行所需的更新(由存储过程完成)。现在问题是,在发生这些更新之后,我需要再次填充tableadapter以便它反映这些更改。有时我使用的View将没有结果,有时可能。我不能给出具体的例子,因为数据对工作敏感,但我会尝试创建一个简化的例子

_taMyView.Fill(_dsMyConnection.MyView)
_bsMyView.Filter = "Number = 1"
For Each drvMyViewRow in _bsMyView
   Do Stuff
   'stored procedure that updates MyTable (what the view was created from)
Next

_taMyView.Fill(_dsMyConnection.MyView)
_bsMyView.Filter = "Number = 0"

这是确切的错误“Timeout expired。在操作完成之前已经过了超时时间,或者服务器没有响应。”

好的,你会注意到我填充了我的视图,然后在列号等于1上过滤那些结果。我遍历所有这些结果并更新我的视图创建的表。退出循环后,我击中第二个.fill,大约20秒后超时。经过测试,只有在MyView没有任何记录时才会出现这个时间。任何帮助将不胜感激。

一些额外的花絮。我使用Visual Studio 2010和sqlserver 2008.所有工作都在VB.NET中完成。此外,在调试过程中,我暂停第二次填充,转到Toad for Data Analysts并运行SELECT * FROM MyView,它没有超时并在大约19秒内返回空结果表。我也尝试在第二次填充之前对tableadapter进行处理,但它有类似的超时时间。对不起,如果这个答案看起来很明显或者其他什么,我只是一个实习生而且还在学习这门语言。

修改

MyAdapter.Adapter.SelectCommand.CommandTimeout = 0

这似乎已经完成了这个技巧,从我的理解让它一直运行直到它完成(如果连接保持打开的时间长于允许的话,SQLServer将关闭它)。 ta.fill的运行速度与Toad大约相同,大约在19-20秒左右,并且在多次测试后没有出错。谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

19秒?多少行?这个观点有多复杂?如果从Toad或Management Studio查询需要19秒,那么从VB.NET代码中获取两倍是非常可行的。也许你应该考虑增加CommandTimeout值(默认是,我相信,30秒)和/或优化结构,如果你认为19秒太长(我当然这样做)。