2009-07-10 94 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);