2009-07-10 6 views
31

Ce délai n'est pas un délai de connexion car une connexion à la base de données est correctement effectuée. Le problème est que la procédure stockée que j'appelle prend plus de temps que, par exemple, 30 secondes et provoque un délai d'expiration.Comment étendre le délai d'attente d'une requête SQL

Le code de la fonction ressemble à quelque chose comme ceci:

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

L'appel ExecuteScalar est hors délai. Comment puis-je prolonger le délai d'attente de cette fonction?

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

+4

OK, downvoting ma question est tout simplement grossier. Ma question est clairement définie et (espérons-le) a une réponse. – BoltBait

Répondre

27

Si vous utilisez le EnterpriseLibrary (et il semble que vous ê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 sur la base des commentaires. J'ai aussi inclus la valeur de votre 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(); 
+0

Essayer maintenant ... – BoltBait

+0

Hmmm ... Je n'ai pas accès aux paramètres. La variable parameterValues ​​dans mon exemple de code est définie comme "object [] parameterValues". Puis-je encore ajouter les paramètres sans connaître les noms uniquement la commande? – BoltBait

+0

J'ai ajouté du code qui devrait convertir votre tableau paramValues ​​en paramètres attendus par le DbCommand. –

22

vous faire en définissant la propriété SqlCommand.CommandTimeout

+3

Ce qui fonctionnerait bien si j'utilisais une SqlCommand ... mais je ne le suis pas. – BoltBait

+3

Oui, vous êtes. SqlDatabase ne fait pas partie du fournisseur de données standard; C'est une classe wrapper que quelqu'un a écrite, et elle utilisera un objet SqlCommand en interne. –

+3

Le "quelqu'un" peut être Microsoft, cependant - est-ce la classe SQLDatabase de Microsoft.Practices.EnterpriseLibrary? –

0

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

+1

Merci de m'avoir dit d'aller optimiser mon application. Soupir. À long terme, cela peut arriver, mais pour AUJOURD'HUI j'ai juste besoin de faire fonctionner cette chose. – BoltBait

+0

Je ne voulais certainement pas offenser. C'est juste que si SQL expire, il est peu probable que vous puissiez trouver un timeout # qui fonctionnera dans toutes les situations. Vous voulez que SQL expire dans de nombreux cas et la valeur par défaut est encore assez longue. – n8wrl

2

Essayez celui

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(); 
5

Je pense que cela pourrait être une meilleure façon de le faire (comme de la bibliothèque Enterprise 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); 
+0

merci mon pote cela économise beaucoup d'heures. très apprécié –

Questions connexes