这不是连接超时,因为与数据库的连接正常。问题是我正在调用的存储过程花费的时间超过30秒并导致超时。
该函数的代码如下所示:
SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);
ExecuteScalar调用超时。如何延长此功能的超时时间?
对于快速存储过程,它工作正常。但是,其中一个功能需要一段时间,而且呼叫失败。当以这种方式调用ExecuteScalar函数时,我似乎找不到任何方法来延长超时时间。
答案 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系统上。