【问题标题】:ADODB query timeoutADODB 查询超时
【发布时间】:2013-07-08 14:41:20
【问题描述】:

我正在尝试打开一个正在超时的查询。我已经尝试设置 timeout 属性,但它似乎不想接受它。

使用 MS-SQL Server 管理窗口 (SQL Server 2005) 执行查询需要 34 秒,所以我知道我需要增加超时时间。

当前代码:

Public Function retRecordSet(StrSQL)
Dim cmd ' as new ADODB.Command
Dim rs 'As New ADODB.Recordset

Set cmd = CreateObject("ADODB.Command")
Set rs = CreateObject("ADODB.Recordset")

cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = StrSQL
cmd.CommandTimeout = 0
Set rs = cmd.Execute

Set retRecordSet = rs
End Function

我也试过设置连接本身的超时时间CurrentProject.Connection.CommandTimeout = 120,但是如果我在这个命令之后查询这个值,它仍然是30

连接属性:

Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data Source=MyServer;Integrated Security=SSPI;Initial Catalog=MyDatabase;Data Provider=SQLOLEDB.1

Data Source Object Threading Model = 1
Multiple Results = 3
Multiple Parameter Sets = False
SQL Support = 283
Catalog Location = 1
Catalog Term = database
Catalog Usage = 15
Rowset Conversions on Command = True
Extended Properties = 
Cache Authentication = True
Encrypt Password = 
Persist Encrypted = 
Persist Security Info = False
Asynchronous Processing = 0
Connect Timeout = 600
Protection Level = 
Prompt = 4
Mode = 
Location = 
Locale Identifier = 1033
Impersonation Level = 
Window Handle = 
Data Source = MyServer
User ID = 
Password = 
Integrated Security = SSPI
Mask Password = 
Initial Catalog = MyDatabase
Lock Owner = 
Bind Flags = 
General Timeout = 0
Data Provider = SQLOLEDB.1
Autocommit Isolation Levels = 4096
Unique Reshape Names = False

【问题讨论】:

  • @HK1,你会看到我将 ADODB 命令上的命令超时设置为 0(无限超时)
  • 不知道为什么 30 秒的超时仍然存在,看起来很奇怪。如果您调用 'rs.open cmd' 而不是 'set rs = cmd.execute' 将命令对象作为源传递会发生什么。只是好奇你是否在那里遇到同样的问题?
  • 您的连接设置如何?当我使用 ADO 连接时,我总是使用我创建的显式连接,因此我不习惯使用 CurrentProject.Connection。这是 ADP 吗?
  • @HK1,是的,这是一个 ADP(我无法更改)

标签: vba ms-access adodb


【解决方案1】:

不确定您是否已经解决了这个问题,但我遇到了同样的问题。 我正在使用 Recordset.Open SQL_String, Connection。

在此之前我只是设置了 timeout 属性,不是在 Recordset 或 Command 上,而是在 Connection 对象上:

Connection.CommandTimeout = 0

【讨论】:

    【解决方案2】:

    来自http://codingjourney.blogspot.com/2008/11/ado-connection-timeout-command-or.html

    解决方案

    您还必须在 ADODB.CommandADODB.Recordset 正在使用中。否则那些对象 将使用 30 秒的默认时间限制,因为它们不 从关联的ADODB.Connection 实例继承时间限制。

    在 ASP 3 中使用 VBScript 的示例:

    set con = createObject("ADODB.Connection")
    con.open connectionString
    con.commandTimeout = 60
    set command = createObject("ADODB.Command")
    command.activeConnection = con
    command.commandType = adCmdText
    command.commandText = sql
    command.commandTimeout = 60
    command.execute
    response.write command.commandTimeout 'This is now 60 seconds.
    

    【讨论】:

    • 关于此:“您还必须在正在使用的 ADODB.Command 或 ADODB.Recordset 上设置 commandTimeout 属性。”我没有在 ADODB.Recordset 对象上看到 CommandTimeout 属性或方法。
    【解决方案3】:

    对于 OLEDB,你不需要在连接上指定超时:-

    Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=False;Data 源=MyServer;集成安全=SSPI;初始 Catalog=MyDatabase;Data Provider=SQLOLEDB.1;Connect Timeout=30

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多