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.
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();
vous faites cela en définissant la propriété SqlCommand.CommandTimeout
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);
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();
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.
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.