2012-04-11 21 views
51

próbuję zastąpić domyślny SqlConnection limit czasu 15 sekund i dostaję błąd mówiąc, że nieruchomośćZmiana limitu czasu SqlConnection

lub indeksowania nie może być przypisany, ponieważ jest tylko do odczytu.

Czy istnieje sposób obejścia tego?

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

Czy chcesz ustawić limit czasu połączenia po próbie otwarcia połączenia? masz na myśli czas polecenia? –

+0

Naprawdę, naprawdę nie rozumiem, dlaczego wprowadzono właściwość tylko do odczytu. Powinny być czytać i pisać, IMO. –

+0

Właściwość jest tylko do odczytu po połączeniu. Zobacz inne odpowiedzi do dyskusji. ConnectionTimeout wpływa na limit czasu podczas próby połączenia. często jest to przydatne w przypadku bazy danych Azure SQL DB. CommandTimeout wpływa na limit czasu podczas uruchamiania zapytania. –

Odpowiedz

107

Jeśli chcesz zapewnić timeout dla konkretnego zapytania, a następnie CommandTimeout jest droga naprzód.

Jego użycie jest:

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

Zawsze możesz dodać go do swojej String Connection:

connect timeout=180; 
+1

Limit czasu połączenia różni się od parametru CommandTimeout. Limit czasu połączenia określa czas potrzebny na rozwiązanie początkowego połączenia z bazą danych. CommandTimeout zmienia limit czasu dla danego zapytania. – m0g

33

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

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

3

Trzeba użyć command.CommandTimeout

3

Możesz dodać Connection Timeout=180; do ciągu połączenia

+1

Limit czasu połączenia różni się od parametru CommandTimeout. Limit czasu połączenia określa czas potrzebny na rozwiązanie początkowego połączenia z bazą danych. CommandTimeout zmienia limit czasu dla danego zapytania. – m0g

5

Stary post ale jak to wyjdzie na to, co szukałem myślałem, że dodać jakieś informacje na ten temat. Zamierzałem dodać komentarz, ale nie mam wystarczającej liczby przedstawicieli.

Jak mówili inni:

connection.ConnectionTimeout służy do wstępnego podłączenia

command.CommandTimeout służy do indywidualnych poszukiwań, aktualizacje, itp

Ale:

połączenie .ConnectionTimeout to również używany do zatwierdzania i wycofywania transakcji.

Tak, to absolutnie szalona decyzja projektowa.

Tak więc, jeśli używasz limitu czasu po zatwierdzeniu lub wycofaniu, musisz zwiększyć tę wartość za pomocą ciągu połączenia.

8

Sprzątaczem 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> 

Wg kodu można uzyskać połączenia 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żna ustawić ConnectionTimeout tylko utworzyć instancję. Gdy tworzona jest instancja, nie zmieniaj tej wartości.

Powiązane problemy