2009-07-10 66 views
31

这不是连接超时,因为与数据库的连接正常。问题是,我打电话的存储过程需要比30秒更长的时间并导致超时。如何延长SQL查询的超时时间

函数的代码看起来是这样的:

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

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

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

+4

OK,downvoting我的问题仅仅是粗鲁的。我的问题是明确的,并且(希望)有一个答案。 – BoltBait 2009-07-10 21:06:05

回答

27

如果您使用的是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(); 
22

您通过设置SqlCommand.CommandTimeout财产

+3

如果我使用的是SqlCommand,那么这将工作得很好......但是,我不是。 – BoltBait 2009-07-10 20:36:51

+3

是的,你是。 SqlDatabase不是标准数据提供者的一部分;它是某人编写的包装类,它将在内部使用SqlCommand对象。 – 2009-07-10 20:43:40

+3

但是,“某人”可能是Microsoft--这是来自Microsoft.Practices.EnterpriseLibrary的SQLDatabase类吗? – 2009-07-10 20:52:22

0

姆拉登是正确的做到这一点,但如果你要做到这一点,你可能有与PROC本身更大的问题。在负载下,它可能比新的超时花费更长的时间。值得花费一些质量时间与proc优化。

2

试试这个

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

我觉得这可能是一个更好的方式来做到这一点(如企业库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);