如何扩展SQL查询的超时

时间:2009-07-10 20:32:47

标签: c# .net sql timeout

这不是连接超时,因为与数据库的连接正常。问题是我正在调用的存储过程花费的时间超过30秒并导致超时。

该函数的代码如下所示:

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

ExecuteScalar调用超时。如何延长此功能的超时时间?

对于快速存储过程,它工作正常。但是,其中一个功能需要一段时间,而且呼叫失败。当以这种方式调用ExecuteScalar函数时,我似乎找不到任何方法来延长超时时间。

6 个答案:

答案 0 :(得分:30)

如果您正在使用EnterpriseLibrary(看起来像你),请尝试:

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

根据评论编辑直接处理paramValues数组。我还包括你的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();

答案 1 :(得分:23)

您可以通过设置SqlCommand.CommandTimeout属性

来执行此操作

答案 2 :(得分:6)

我认为这可能是更好的方法(从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);

答案 3 :(得分:3)

试试这个

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

答案 4 :(得分:0)

Mladen是对的,但如果你必须这样做,那么你可能对proc本身有更大的问题。在负载下,它可能比新的超时花费更长的时间。可能值得花一些时间与proc进行优化。

答案 5 :(得分:0)

由于Microsoft问题,可能会发生超时。似乎仍然出现在我的Windows 8系统上。

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