Zeitlimit für SqlConnection ändern

81

Ich versuche, das Standardzeitlimit SqlConnectionvon 15 Sekunden zu überschreiben, und erhalte die Fehlermeldung, dass die

Eigenschaft oder Indexer können nicht zugewiesen werden, da sie schreibgeschützt sind.

Gibt es einen Weg, dies zu umgehen?

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();
    }
}
Haymak3r
quelle
5
Möchten Sie ein Verbindungszeitlimit festlegen, nachdem Sie versucht haben, die Verbindung zu öffnen? Meinst du Commandtimeout?
Alex K.
2
Ich verstehe wirklich nicht, warum sie das Anwesen schreibgeschützt gemacht haben. Hätte lesen und schreiben sollen, IMO.
Xofz
Die Eigenschaft ist nach der Verbindung schreibgeschützt. Weitere Antworten finden Sie zur Diskussion. ConnectionTimeout wirkt sich auf das Timeout aus, wenn versucht wird, eine Verbindung herzustellen. Es ist oft nützlich, dies für Azure SQL DB zu erhöhen. CommandTimeout wirkt sich beim Ausführen einer Abfrage auf das Zeitlimit aus.
Bill Gibson - MSFT
@ Sam Pearson Es wird bis zum Öffnen der Verbindung gelesen und geschrieben, dh wenn die Verbindung hergestellt wird.Open (); wird genannt. Ab diesem Zeitpunkt läuft der Timer bereits.
WonderWorker

Antworten:

155

Wenn Sie ein Zeitlimit für eine bestimmte Abfrage angeben möchten, ist CommandTimeout der richtige Weg.

Seine Verwendung ist:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.
Anil Mathew
quelle
15
Er spricht nicht über das Befehlszeitlimit, sondern über das Verbindungszeitlimit.
LarryBud
39

Sie können den Timeout-Wert in der Verbindungszeichenfolge festlegen, aber nachdem Sie die Verbindung hergestellt haben, ist er schreibgeschützt. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Wie Anil andeutet, ist ConnectionTimeout möglicherweise nicht das, was Sie benötigen. Es steuert, wie lange der ADO-Treiber beim Herstellen einer neuen Verbindung wartet. Ihre Verwendung scheint darauf hinzudeuten, dass Sie länger als normal auf die Ausführung einer bestimmten SQL-Abfrage warten müssen. In diesem Fall ist Anil genau richtig. Verwenden Sie CommandTimeout (R / W), um die erwartete Abschlusszeit für einen einzelnen SqlCommand zu ändern.

KeithS
quelle
19

Ein sauberere Weg ist , um Satz Connection in XML - Datei, zum Beispiel Web.Confing(WepApplication)oder 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>

Durch Code können Sie Verbindung auf folgende Weise erhalten:

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

Sie können festlegen, dass ConnectionTimeoutnur Sie eine Instanz erstellen. Wenn eine Instanz erstellt wird, ändern Sie diesen Wert nicht.

daniele3004
quelle
17

Sie können es jederzeit zu Ihrer Verbindungszeichenfolge hinzufügen:

connect timeout=180;
Justin Niessner
quelle
2
Das Verbindungszeitlimit unterscheidet sich von CommandTimeout. Das Verbindungszeitlimit gibt an, wie lange es dauert, bis die anfängliche Verbindung zur Datenbank hergestellt ist. CommandTimeout ändert den Timeout-Zeitraum für die jeweilige Abfrage.
m0g
@ m0g Ich verstehe nicht, warum dies nicht die akzeptierte Antwort ist. Die Frage hier bezieht sich wahrscheinlich sehr deutlich auf das Verbindungszeitlimit, das standardmäßig 15 ist, und ist eine schreibgeschützte Eigenschaft einer SqlConnection, die in der Verbindungszeichenfolge definiert werden muss. Die Codezeile, die im Poster aufgelistet ist, versucht speziell, SqlConnection.ConnectionTimeout festzulegen. Das Command Timeout ist standardmäßig 30 und ein Lese- / Schreibparameter des SqlCommand, eines völlig anderen Objekts. Die Fehlermeldung der Frage zeigt einen Wert von 15 an, und die Frage lautet speziell SqlConnection, nicht SqlCommand.
Bacon Bits
1
@BaconBits was das Frageplakat beschreibt und stellt, ist anders als das, was er will, daher ist die akzeptierte Antwort etwas anderes.
m0g
8

Sie können Connection Timeout=180;Ihrer Verbindungszeichenfolge hinzufügen

Horev Ivan
quelle
4
Das Verbindungszeitlimit unterscheidet sich von CommandTimeout. Das Verbindungszeitlimit gibt an, wie lange es dauert, bis die anfängliche Verbindung zur Datenbank hergestellt ist. CommandTimeout ändert den Timeout-Zeitraum für die jeweilige Abfrage.
m0g
7

Sie können auch den SqlConnectionStringBuilder verwenden

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

Alter Beitrag, aber als sich herausstellte, wonach ich gesucht hatte, dachte ich, ich würde diesem Thema einige Informationen hinzufügen. Ich wollte einen Kommentar hinzufügen, aber ich habe nicht genug Wiederholungen.

Wie andere gesagt haben:

connection.ConnectionTimeout wird für die Erstverbindung verwendet

command.CommandTimeout wird für einzelne Suchvorgänge, Aktualisierungen usw. verwendet.

Aber:

connection.ConnectionTimeout wird auch zum Festschreiben und Zurücksetzen von Transaktionen verwendet.

Ja, das ist eine absolut verrückte Designentscheidung.

Wenn beim Festschreiben oder Rollback ein Timeout auftritt, müssen Sie diesen Wert über die Verbindungszeichenfolge erhöhen.

Nick Thompson
quelle
"Connection.ConnectionTimeout wird auch zum Festschreiben und Zurücksetzen von Transaktionen verwendet. Ja, dies ist eine absolut verrückte Entwurfsentscheidung." "Ja wirklich?" Ich glaube nicht, dass das wahr ist. Wenn dies der Fall ist, schlägt jede Transaktion fehl, die länger als das Verbindungszeitlimit von 15 Sekunden dauert. Sie müssen klären.
Triynko
Wenn Sie damit meinen, dass es als Zeitlimit für die Übermittlung nur des Commit- oder Rollback-Befehls verwendet wird, dann nein ... das ist keine verrückte Entscheidung. Es handelt sich im Grunde genommen um einen sofortigen Befehl, der sofort zurückgegeben werden sollte, da er dem Server lediglich signalisiert, dass er festgeschrieben oder zurückgesetzt werden soll. Wenn es den Server nicht erreicht und sofort eine Antwort erhält, ist dies im Grunde ein Verbindungszeitlimit, weshalb es sinnvoll wäre, diese Methode zu verwenden.
Triynko
3

Sie können das Verbindungszeitlimit auf die Verbindungsebene und die Befehlsebene einstellen.

Fügen Sie der Verbindungszeichenfolge "Verbindungszeitlimit = 10" hinzu. Das Verbindungszeitlimit beträgt jetzt 10 Sekunden.

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

}

Setzen Sie die Eigenschaft CommandTimeout auf 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;
    }

}
Jakir Hossain
quelle
2

Sie müssen verwenden command.CommandTimeout

LewisT
quelle