SqlConnectionタイムアウトの変更


81

デフォルトのSqlConnectionタイムアウトである15秒を上書きしようとすると、次のようなエラーが発生します。

プロパティまたはインデクサは読み取り専用であるため、割り当てることができません。

これを回避する方法はありますか?

using (SqlConnection connection = new SqlConnection(Database.EstimatorConnection))
{
   connection.Open();

   using (SqlCommand command = connection.CreateCommand())
   {
       command.CommandType = CommandType.StoredProcedure;
       connection.ConnectionTimeout = 180; // This is not working 
       command.CommandText = "sproc_StoreData";
       command.Parameters.AddWithValue("@TaskPlanID", order.Projects[0].TaskPlanID);
       command.Parameters.AddWithValue("@AsOfDate", order.IncurDate);

       command.ExecuteNonQuery();
    }
}

5
接続を開こうとした後に接続タイムアウトを設定することを意味しますか?commandtimeoutのことですか?
Alex K.

2
なぜ彼らがプロパティを読み取り専用にしたのか、私は本当に本当にわかりません。読み取り/書き込み、IMOである必要があります。
xofz 2016年

接続後、プロパティは読み取り専用になります。議論については他の回答を参照してください。ConnectionTimeoutは、接続を試みるときのタイムアウトに影響を与えます。多くの場合、Azure SQLDBの場合はこれを増やすと便利です。CommandTimeoutは、クエリ実行時のタイムアウトに影響を与えます。
ビルギブソン-MSFT 2017

@Sam Pearson接続が開かれるまで、つまりconnection.Open();が開かれるまで、読み取りと書き込みが行われます。と呼ばれます。この時点から、タイマーはすでに実行されています。
WonderWorker 2017

回答:


156

特定のクエリにタイムアウトを指定する場合は、CommandTimeoutが最適です。

その使用法は次のとおりです。

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.

17
彼はコマンドのタイムアウトについて話しているのではなく、接続のタイムアウトについて話しているのです。
LarryBud

39

接続文字列でタイムアウト値を設定できますが、接続後は読み取り専用になります。詳細については、http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspxを参照してください。

Anilが示唆しているように、ConnectionTimeoutは必要なものではない可能性があります。これは、新しい接続を確立するときにADOドライバーが待機する時間を制御します。あなたの使用法は、特定のSQLクエリが実行されるまで通常より長く待つ必要があることを示しているようです。その場合、Anilは正確に正しいです。CommandTimeout(R / W)を使用して、個々のSqlCommandの予想完了時間を変更します。


20

よりクリーンな方法は、たとえばWeb.Confing(WepApplication)またはのxmlファイルにconnectionStringを設定することApp.Config(StandAloneApplication)です。

 <connectionStrings>
    <remove name="myConn"/>
    <add name="myConn" connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>

コードにより、次の方法で接続を取得できます。

public static SqlConnection getConnection()
{
        string conn = string.Empty;
        conn = System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
        SqlConnection aConnection = new SqlConnection(conn);
        return aConnection;
}

ConnectionTimeoutインスタンスを作成するのは自分だけに設定できます。インスタンスが作成されるとき、この値を変更しないでください。


17

いつでも接続文字列に追加できます。

connect timeout=180;

2
接続タイムアウトはCommandTimeoutとは異なります。接続タイムアウトは、データベースへの最初の接続を解決するのにかかる時間です。CommandTimeoutは、特定のクエリのタイムアウト期間を変更します。
m0g 2014

@ m0gなぜこれが受け入れられない答えなのかわかりません。ここでの質問は、おそらく接続タイムアウト(デフォルトは15)に関するものであり、接続文字列で定義する必要があるSqlConnectionの読み取り専用プロパティです。ポスターがリストするコード行は、特にSqlConnection.ConnectionTimeoutを設定しようとします。コマンドタイムアウトのデフォルトは30で、完全に異なるオブジェクトであるSqlCommandの読み取り/書き込みパラメーターです。質問のエラーメッセージには値15が表示され、質問にはSqlCommandではなくSqlConnectionが具体的に示されます。
ベーコンビット

1
@BaconBitsは、質問の投稿者が説明して尋ねたものと、彼が望んでいるものが異なるため、受け入れられる回答は異なります。
m0g 2018年

8

Connection Timeout=180;接続文字列に追加できます


4
接続タイムアウトはCommandTimeoutとは異なります。接続タイムアウトは、データベースへの最初の接続を解決するのにかかる時間です。CommandTimeoutは、特定のクエリのタイムアウト期間を変更します。
m0g 2014

7

SqlConnectionStringBuilderを使用することもできます

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}

6

古い投稿ですが、探していたものが出てきたので、このトピックにいくつかの情報を追加したいと思いました。コメントを追加するつもりでしたが、担当者が足りません。

他の人が言ったように:

connection.ConnectionTimeoutは初期接続に使用されます

command.CommandTimeoutは、個々の検索、更新などに使用されます。

だが:

connection.ConnectionTimeoutトランザクションのコミットとロールバックに使用されます。

はい、これは絶対に正気でない設計上の決定です。

したがって、コミットまたはロールバックでタイムアウトが発生した場合は、接続文字列を介してこの値を増やす必要があります。


「Connection.ConnectionTimeoutは、トランザクションのコミットとロールバックにも使用されます。はい、これは絶対に狂った設計上の決定です。」本当に?私はこれが真実だとは思わない。trueの場合、接続タイムアウトの15秒より長く続くトランザクションは失敗します。明確にする必要があります。
Triynko

さて、それがそれ自体でコミットまたはロールバックコマンドだけを送信するためのタイムアウトとして使用されることを意味するのであれば、いいえ...それは狂気の決定ではありません。これは基本的に瞬時のコマンドであり、サーバーにコミットまたはロールバックするように通知するだけなので、すぐに戻る必要があります。サーバーに到達できず、すぐに応答が返される場合は、基本的に接続タイムアウトです。そのため、この方法を使用するのが理にかなっています。
Triynko

3

接続タイムアウトを接続レベルとコマンドレベルに設定できます。

接続文字列に「ConnectionTimeout = 10」を追加します。現在、接続タイムアウトは10秒です。

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=10";
using (var con = new SqlConnection(connectionString))
{

}

ofCommandTimeoutプロパティをSqlCommandに設定します

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword";
using (var con = new SqlConnection(connectionString))
{

    using (var cmd =new SqlCommand())
    {
        cmd.CommandTimeout = 10;
    }

}

2

あなたは使用する必要があります command.CommandTimeout


0

このテーマに関する優れたブログ投稿を見つけました:https://improve.dk/controlling-sqlconnection-timeouts/

基本的に、接続文字列でConnect Timeoutを設定するか、コマンドオブジェクトでConnectionTimeoutを設定します。

タイムアウト時間は秒単位であることに注意してください。


こんにちは、SOへようこそ!ツアーを読んでください、そしてどうすれば良い答えを書くことができますか?コードサンプルの追加は常に役立ちます。
TomerShetah20年

リンクのみの使用は避けてください。リンクは将来変更される可能性があります。いくつかの貴重なヒントを追加し、必要があれば助けにいくつかのソースコードは、あなたの答えを明確に
ColinWa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.