web-dev-qa-db-fra.com

Délai d'expiration de la requête ADODB

J'essaie d'ouvrir une requête, qui expire. J'ai essayé de définir la propriété timeout, mais il ne semble pas vouloir l'accepter.

La requête prend 34 secondes pour s'exécuter à l'aide de la fenêtre de gestion de MS-SQL Server (SQL Server 2005), donc je sais que je dois augmenter le délai d'expiration.

Code actuel:

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

J'ai également essayé de définir le délai d'expiration de la connexion elle-même CurrentProject.Connection.CommandTimeout = 120, mais si je recherche la valeur juste après cette commande, elle reste à 30

Propriétés de connexion:

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
12
SeanC

Je ne sais pas si vous avez déjà surmonté le problème, mais j'ai eu le même problème. Je le fais avec Recordset.Open SQL_String, Connection.

Et avant cela, je viens de définir la propriété timeout, non pas sur le Recordset ou la commande mais sur l'objet Connection:

Connection.CommandTimeout = 0
22
Manuel

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

La solution

Vous devez également définir la propriété commandTimeout sur le ADODB.Command ou ADODB.Recordset utilisé. Sinon, ces objets utiliseront la limite de temps par défaut de 30 secondes car ils n'héritent pas de la limite de temps de la ADODB.Connection exemple.

Exemple d'utilisation de VBScript dans ASP 3:

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.
6
BreakBadSP

Pour OLEDB, vous n'avez pas besoin de spécifier le délai d'expiration de la connexion: -

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

0
Richard Spencer