web-dev-qa-db-fra.com

Comment prolonger le délai d'expiration d'une requête SQL

Il ne s'agit pas d'un délai d'expiration de connexion, car une connexion à la base de données est correctement établie. Le problème est que la procédure stockée que j'appelle prend plus de temps, disons, 30 secondes et provoque un délai d'attente.

Le code de la fonction ressemble à ceci:

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);

L'appel ExecuteScalar arrive à expiration. Comment puis-je prolonger le délai d'expiration de cette fonction?

Pour les procédures stockées rapides, cela fonctionne bien. Mais, l'une des fonctions prend un certain temps et l'appel échoue. Je n'arrive pas à trouver de moyen d'étendre le délai d'expiration lorsque la fonction ExecuteScalar est appelée de cette façon.

34
BoltBait

Si vous utilisez EnterpriseLibrary (et il semble que vous l'êtes), essayez ceci:

 Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase("ConnectionString");
 System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName");
 cmd.CommandTimeout = 600;
 db.AddInParameter(cmd, "ParameterName", DbType.String, "Value");

 // Added to handle paramValues array conversion
 foreach (System.Data.SqlClient.SqlParameter param in parameterValues) 
 {
     db.AddInParameter(cmd, param.ParameterName, param.SqlDbType, param.Value);
 }

 return cmd.ExecuteScalar();

Modifié pour gérer le tableau paramValues ​​directement en fonction des commentaires. J'ai également inclus votre valeur ConnectionString:

Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName", parameterValues);
cmd.CommandTimeout = 600;
return cmd.ExecuteScalar();
30
Chris Porter

vous faites cela en définissant la propriété SqlCommand.CommandTimeout

23
Mladen Prajdic

Je pense que cela pourrait être une meilleure façon de le faire (à partir de Enterprise Library 6.0):

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand(storedProc, parameterValues);
cmd.CommandTimeout = 600;
return db.ExecuteScalar(cmd);
6
Steve Fortner

Essaye celui-là

SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString);
connectionStringBuilder.ConnectTimeout = 180;
connection.ConnectionString = connectionStringBuilder.ConnectionString;

connection.Open();
SqlCommand command = new SqlCommand("sp_ProcedureName", connection);
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = connection.ConnectionTimeout;
command.ExecuteNonQuery();
connection.Close();
3
Ozgur

Un délai d'attente peut survenir en raison d'un problème avec Microsoft. Semble toujours se produire sur mon système Windows 8.

http://support.Microsoft.com/kb/2605597?wa=wsignin1.

0
BSalita

Mladen a raison mais si vous devez le faire, vous avez probablement un plus gros problème avec le proc lui-même. Sous charge, cela peut prendre beaucoup plus de temps que votre nouveau délai d'expiration. Cela pourrait valoir la peine de passer du temps de qualité avec le proc pour optimiser.

0
n8wrl