2009-09-27 49 views
6

Używam ADO.Net + C# + VSTS 2008 + ADO.Net do połączenia z SQL Server 2008 Enterprise. Używam prawie tego samego wzorca/próbki, o którym tutaj wspomniano - przy użyciu ADO.Net DataReader do pobrania danych jednego wpisu (wiersza) przez jeden wpis (wiersz).ADO.Net DataReader timeout issue

http://msdn.microsoft.com/en-us/library/haa3afyz.aspx

Moje pytanie brzmi, czy mogę ustawić limit czasu SqlCommand w tej próbce, 1. Myślę, że czas oczekiwania dotyczy ile czasu możemy użyć jako wartości maksymalnej do pobierania jednego SZCZEGÓLNE wiersz, a nie całkowity timeout dla całej pętli entry-by-entry dla danych?

BTW: pętla Znaczy,

while (reader.Read()) 
{ 
    Console.WriteLine("{0}\t{1}", reader.GetInt32(0), 
     reader.GetString(1)); 
} 

2. a to liczy się tylko czas oczekiwania, ile czasu potrzeba, aby odzyskać wprowadzanie danych z bazy danych, a ten limit czasu nie ma nic wspólnego z tym, jak dużo czasu mamy do czynienia z każdym wpisem (np. jeśli ustawimy limit czasu na 20 sekund, i zajmie to 1 sekundę, aby pobrać jeden wpis danych z bazy danych, i zajmie 30 sekund, aby moje logiki aplikacji mogły manipulować wprowadzeniem danych, limit czasu nigdy się nie wydarzy).

Prawidłowe zrozumienie?

Odpowiedz

10

Limit czasu polecenia, który można ustawić, dotyczy czasu, w którym ADO.NET wykonuje swoją pracę.

Jeśli zadzwonisz pod numer cmdQuery.ExecuteNonQuery(), który nie zwraca niczego poza wykonaniem instrukcji SQL, jest to czas potrzebny do wykonania tej instrukcji.

Jeśli zadzwonisz pod numer cmdQuery.ExecuteReader(), który zwróci czytnik danych, jest to czas potrzebny do ukrycia/skonstruowania czytnika danych przez ADO.NET, abyś mógł z niego korzystać.

Jeśli zadzwonisz pod numer cmdQuery.ExecuteScalar(), który zwraca pojedynczą wartość skalarną, jest to czas potrzebny na wykonanie zapytania i pobranie tego pojedynczego wyniku.

Jeśli używasz dataAdapter.Fill() do wypełnienia tabeli danych lub zestawu danych, jest to czas potrzebny na pobranie danych przez ADO.NET, a następnie wypełnienie tabeli danych lub zestawu danych.

Tak ogólnie: limit czasu ma zastosowanie do części zadania, które może wykonać ADO.NET - wykonaj instrukcję, wypełnij zestaw danych, zwróć wartość skalarną.

Oczywiście robi NIE dotyczą czasu potrzebnego TY iterację wyników (w przypadku czytnika danych). To nie ma sensu w ogóle ...

Marca

+0

Dzięki Marc 1. Czy masz na myśli scenariusz do DataReadera, kiedy otrzymam instancję DataReadera, limit czasu nie przyniesie żadnego efektu? 2. Jeśli tak, moje nieporozumienie, czytam niektóre dokumenty wcześniej dla DataReader, ADO.Net pobiera dane w strumieniu transmisji, tzn. Nie wszystkie dane są pobierane z serwera SQL podczas tworzenia DataReadera. Jeśli to prawda, to powinno następować dalsze przeniesienie między klientem ADO.Net a serwerem serwera SQL Server?Ale jak już powiedziałeś, timeout nie ma już żadnego wpływu po utworzeniu DataReadera, więc nie ma kontroli limitu czasu dla dalszego przesyłania strumieniowego? – George2

+0

Moje zainteresowanie powyższymi komentarzami polega na tym, że klienci będą przechowywać urządzenie DataReader przez bardzo długi czas i myślę, że w trybie strumieniowym (ponieważ ADO.Net nie może przewidzieć, czy klient chce odczytać więcej danych lub po prostu przerwać pętlę czytnika), połączenie będzie utrzymywane przy życiu przez cały czas. Chcę mieć kontrolę timeout dla takiego zachowania, które zmusza tak długi, aktywny czytnik do zamknięcia/zwolnienia połączenia z ADO.Net. Dowolny wydaje się, że SqlCommand (używane do tworzenia DataReader) limit czasu nie jest tym, czego szukam? Dzięki. – George2

+1

Masz całkowitą rację: jeśli pozostawisz czytnik DataReader otwarty przez długi czas, podstawowe połączenie pozostanie otwarte w tym samym czasie. Nie ma powodu, aby powstrzymać cię przed zrobieniem tego - Twoim obowiązkiem jest upewnienie się, że nie robisz tego zbyt długo. –

2

Tak, masz rację. Parametr CommandTimeout oznacza czas bazy danych potrzebny do wykonania polecenia (dowolne polecenie).

+0

Co mnie niepokoi to, na DataReader SqlCommand, możemy odzyskać wprowadzanie danych, jeden po drugim, ale dla innych typów SQLCommand, możemy pobierać dane w jednym czasie. Tak, dla DataReader, limit czasu dotyczy tylko jednego wpisu danych, a nie dla całej pętli odzyskiwania danych wejściowych? Doceń, jeśli mógłbyś potwierdzić. :-) – George2