2009-01-09 94 views
4

我们公司有一大堆VB6应用程序。我们正在尝试调试随机SQL超时错误,并在Audit Login事件中使用SQL Server Profiler进行跟踪。我们注意到这些连接是以非流氓方式进入的。我们在SQL Server 2000中使用SQLOLEDB提供程序& 2005.我搜索了互联网,并且我遇到的所有问题都说默认情况下SQLOLEDB提供程序中的连接是集中的,但我们没有看到这一点。以下是我们用来连接数据库的代码。我们确实需要将这些连接汇集起来,因为我们认为这可能是我们的随机超时错误的问题。任何人都可以点亮一下为什么连接池无法正常工作以及有什么办法可以使它工作?谢谢。VB6 ADO连接池

Dim cnn As New ADODB.Connection 
cnn.ConnectionString = "Provider=SQLOLEDB;Data Source=xxx;Catalog=xxx;User ID=xxx Password=xxx;" 
Call cnn.Open 
Dim cmd As New ADODB.Command 
Set cmd.ActiveConnection = cnn 
cmd.CommandText = "SELECT * FROM [Table]" 
Dim rs As New ADODB.RecordSet 
Call rs.Open(cmd, , adOpenStatic, adLockOptimistic) 
While Not rs.eof 
    'Do stuff 
    Call rs.MoveNext 
Wend 
'Close and Dispose connection here 

回答

0

我搞砸周围,开在应用程序启动一个连接并保持它通过应用程序正在运行的整个时间打开。连接池确实在第二次打开和关闭连接后开始。

+0

很高兴帮助。 – cmsjr 2009-01-09 19:09:34

0

你提到你试图追查一个随机超时问题。我有同样的,通常当我做一个返回了很多行的SELECT。两件事情:

Cnn.CursorLocation = ADODB.adUseServer

(另一种选择是为adUseClient) - 我相信adUseServer给了我更快的查询,从而减少超时的情形产生。我相信,在你打开连接之前,你需要这样做。

Cnn.CommandTimeout = 0

而且在开盘前(),告诉你想无限超时了。我认为默认的超时时间大约是30秒,对于某些查询来说太短了。 CommandTimeout将用于Recordset查询。如果你使用一个Command对象,它有它自己的CommandTimeout成员,它不会从Connection继承(也就是说,在我执行命令之前设置它)。

对不起,如果语法不是很正确,我正在削减一些C++代码。