Zmiana limitu czasu SqlConnection

81

Próbuję zastąpić domyślny SqlConnectionlimit czasu wynoszący 15 sekund i pojawia się błąd informujący, że plik

nie można przypisać właściwości ani indeksatora, ponieważ jest on tylko do odczytu.

Czy jest na to sposób?

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
źródło
5
Czy chcesz ustawić limit czasu połączenia po próbie otwarcia połączenia? masz na myśli limit czasu polecenia?
Alex K.
2
Naprawdę, naprawdę nie rozumiem, dlaczego ustawili właściwość tylko do odczytu. Powinien być do odczytu i zapisu, IMO.
xofz
Właściwość jest tylko do odczytu po połączeniu. Zobacz inne odpowiedzi do dyskusji. ConnectionTimeout wpływa na limit czasu podczas próby nawiązania połączenia. często warto zwiększyć tę wartość dla Azure SQL DB. CommandTimeout wpływa na limit czasu podczas uruchamiania zapytania.
Bill Gibson - MSFT
@Sam Pearson Jest do odczytu i zapisu aż do otwarcia połączenia, tj. Gdy connection.Open (); jest nazywany. Od tego momentu licznik czasu już działa.
WonderWorker

Odpowiedzi:

156

Jeśli chcesz podać limit czasu dla określonego zapytania, to CommandTimeout jest rozwiązaniem.

Jego zastosowanie to:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.
Anil Mathew
źródło
17
Nie mówi o przekroczeniu limitu czasu polecenia, on mówi o limicie czasu połączenia.
LarryBud
39

Możesz ustawić wartość limitu czasu w parametrach połączenia, ale po połączeniu jest tylko do odczytu. Możesz przeczytać więcej na http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Jak sugeruje Anil, ConnectionTimeout może nie być tym, czego potrzebujesz; kontroluje, jak długo sterownik ADO będzie czekał podczas nawiązywania nowego połączenia. Twoje użycie wydaje się wskazywać na potrzebę czekania dłużej niż zwykle na wykonanie określonego zapytania SQL, a w tym przypadku Anil ma dokładnie rację; użyj CommandTimeout (czyli R / W), aby zmienić oczekiwany czas ukończenia dla pojedynczego SqlCommand.

KeithS
źródło
20

Bardziej przejrzystym sposobem jest ustawienie connectionString w pliku xml, na przykład Web.Confing(WepApplication)lub 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>

Kodem możesz uzyskać połączenie w ten sposób:

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

Możesz ustawić ConnectionTimeouttylko ty, aby utworzyć instancję. Podczas tworzenia instancji nie zmieniasz tej wartości.

daniele3004
źródło
17

Zawsze możesz dodać go do parametrów połączenia:

connect timeout=180;
Justin Niessner
źródło
2
Limit czasu połączenia różni się od CommandTimeout. Limit czasu połączenia dotyczy czasu potrzebnego do rozwiązania początkowego połączenia z bazą danych. CommandTimeout zmienia limit czasu dla określonego zapytania.
m0g
@ m0g Nie rozumiem, dlaczego to nie jest akceptowana odpowiedź. Pytanie tutaj prawdopodobnie bardzo wyraźnie dotyczy limitu czasu połączenia, który domyślnie wynosi 15 i jest właściwością tylko do odczytu SqlConnection, która musi być zdefiniowana w parametrach połączenia. Wiersz kodu, który wyświetla plakat, próbuje ustawić SqlConnection.ConnectionTimeout. Limit czasu polecenia wynosi domyślnie 30 i jest parametrem odczytu / zapisu SqlCommand, zupełnie innego obiektu. Komunikat o błędzie pytania zawiera wartość 15, a pytanie konkretnie mówi SqlConnection, a nie SqlCommand.
Bacon Bits
1
@Bacon Bits to, co opisał i zadał plakat z pytaniami, a to, czego chce, jest inne, dlatego przyjęta odpowiedź jest inna.
m0g
8

Możesz dodać parametry Connection Timeout=180;połączenia

Horev Ivan
źródło
4
Limit czasu połączenia różni się od CommandTimeout. Limit czasu połączenia dotyczy czasu potrzebnego do rozwiązania początkowego połączenia z bazą danych. CommandTimeout zmienia limit czasu dla określonego zapytania.
m0g
7

Możesz również użyć SqlConnectionStringBuilder

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}
kelwin
źródło
6

Stary post, ale gdy pojawiło się to, czego szukałem, pomyślałem, że dodam trochę informacji do tego tematu. Chciałem dodać komentarz, ale nie mam wystarczającej liczby przedstawicieli.

Jak powiedzieli inni:

connection.ConnectionTimeout jest używany do połączenia początkowego

command.CommandTimeout służy do indywidualnych wyszukiwań, aktualizacji itp.

Ale:

connection.ConnectionTimeout służy również do zatwierdzania i wycofywania transakcji.

Tak, to absolutnie szalona decyzja projektowa.

Tak więc, jeśli napotkasz limit czasu na zatwierdzenie lub wycofanie, musisz zwiększyć tę wartość za pomocą parametrów połączenia.

Nick Thompson
źródło
„Connection.ConnectionTimeout służy również do zatwierdzania i wycofywania transakcji. Tak, to absolutnie szalona decyzja projektowa”. Naprawdę? Nie wierzę, że to prawda. Jeśli to prawda, każda transakcja, która trwa dłużej niż limit czasu połączenia wynoszący 15 sekund, zakończy się niepowodzeniem. Musisz wyjaśnić.
Triynko
Otóż, jeśli masz na myśli, że został użyty jako limit czasu na przesłanie samego tylko polecenia commit lub rollback, to nie ... to nie jest szalona decyzja. Zasadniczo jest to natychmiastowe polecenie, które powinno powrócić natychmiast, ponieważ sygnalizuje tylko serwerowi zatwierdzenie lub wycofanie. Jeśli nie uda mu się dotrzeć do serwera i natychmiast uzyskać odpowiedzi, oznacza to w zasadzie limit czasu połączenia, dlatego warto użyć tego sposobu.
Triynko
3

Limit czasu połączenia można ustawić na poziomie połączenia i poziomie poleceń.

Dodaj „Connection Timeout = 10” do parametrów połączenia. Teraz limit czasu połączenia wynosi 10 sekund.

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

}

Ustaw właściwość CommandTimeout na 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
źródło
2

Musisz użyć command.CommandTimeout

LewisT
źródło
0

Znalazłem doskonały blog na ten temat: https://improve.dk/controlling-sqlconnection-timeouts/

Zasadniczo możesz ustawić limit czasu połączenia w parametrach połączenia lub ustawić ConnectionTimeout w obiekcie polecenia.

Należy pamiętać, że limit czasu jest w sekundach.

macnerd
źródło
Witam i witam w SO! Przeczytaj prezentację i jak napisać dobrą odpowiedź? Dodawanie próbek kodu jest zawsze pomocne.
Tomer Shetah
Unikaj używania samych linków, linki mogą się zmienić w przyszłości. Dodaj kilka cennych wskazówek i trochę kodu źródłowego, aby w razie potrzeby wyjaśnić odpowiedź
ColinWa,