web-dev-qa-db-ja.com

SQLクエリのタイムアウトを延長する方法

データベースへの接続が正常に行われるため、これは接続タイムアウトではありません。問題は、呼び出しているストアドプロシージャが、たとえば30秒より長くかかり、タイムアウトが発生することです。

関数のコードは次のようになります。

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

ExecuteScalar呼び出しがタイムアウトしています。この機能のタイムアウト期間を延長するにはどうすればよいですか?

迅速なストアドプロシージャの場合、正常に機能します。ただし、関数の1つに時間がかかり、呼び出しは失敗します。 ExecuteScalar関数がこの方法で呼び出されると、タイムアウト期間を延長する方法を見つけることができないようです。

34
BoltBait

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();
30
Chris Porter

これを行うには、 SqlCommand.CommandTimeout プロパティを設定します

23
Mladen Prajdic

私はこれをこれを行うためのより良い方法かもしれないと思います(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);
6
Steve Fortner

これを試して

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

タイムアウトは、Microsoftの問題により発生する可能性があります。 Windows 8システムでまだ発生しているようです。

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

0
BSalita

Mladenは正しいですが、これを行う必要がある場合は、おそらくproc自体に大きな問題があります。負荷がかかると、新しいタイムアウトよりもはるかに時間がかかる場合があります。最適化するためにprocで十分な時間を費やす価値があるかもしれません。

0
n8wrl