データベースへの接続が正常に行われるため、これは接続タイムアウトではありません。問題は、呼び出しているストアドプロシージャが、たとえば30秒より長くかかり、タイムアウトが発生することです。
関数のコードは次のようになります。
SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);
ExecuteScalar呼び出しがタイムアウトしています。この機能のタイムアウト期間を延長するにはどうすればよいですか?
迅速なストアドプロシージャの場合、正常に機能します。ただし、関数の1つに時間がかかり、呼び出しは失敗します。 ExecuteScalar関数がこの方法で呼び出されると、タイムアウト期間を延長する方法を見つけることができないようです。
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();
これを行うには、 SqlCommand.CommandTimeout プロパティを設定します
私はこれをこれを行うためのより良い方法かもしれないと思います(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);
これを試して
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();
タイムアウトは、Microsoftの問題により発生する可能性があります。 Windows 8システムでまだ発生しているようです。
Mladenは正しいですが、これを行う必要がある場合は、おそらくproc自体に大きな問題があります。負荷がかかると、新しいタイムアウトよりもはるかに時間がかかる場合があります。最適化するためにprocで十分な時間を費やす価値があるかもしれません。