2017-02-14 6 views
0

Ich würde gerne die Beziehung zwischen Verbindungs-Timeout und Kommando-Timeout verstehen und wie man sich auf andere auswirkt. Bitte beachten Sie diesen Code als Beispiel.SqlDataReader Verbindungs-Timeout vs Kommando-Timeout

// declare the SqlDataReader, which is used in 
// both the try block and the finally block 
SqlDataReader rdr = null; 

// create a connection object 
SqlConnection conn = new SqlConnection("someconnstr"); 

// create a command object 
SqlCommand cmd = new SqlCommand("select * from dbo.mytable", conn); 

try 
{ 
    // open the connection 
    conn.Open(); 

    // 1. get an instance of the SqlDataReader 
    rdr = cmd.ExecuteReader(); 

    while (rdr.Read()) 
    { 
     // get the results of each column 
     Guid Id = (Guid)rdr["Id"]; 
     string displayName = (string)rdr["Name"]; 

     // print out the results 
     Console.WriteLine("{0}, {1}", Id, displayName); 
    } 

    Console.WriteLine("Reading done"); 
} 
catch(Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 

Wie pro MSDN link ist Befehl Timeout ein kumulativer Timeout für alle liest. Das heißt, wenn Sie Read() erneut aufrufen, dauert es weitere 30 Sekunden. Ich möchte Timeout so einstellen, dass ich für alle Datensätze eine maximale Zeitüberschreitung auferlegen kann.

Ist ein Verbindungstimeout eine gute Sache, um dies zu tun? In dem gegebenen Beispiel, wenn ich Verbindungs-Timeout auf 120 Sekunden setze und die While-Schleife nicht in 120 Sekunden beendet, wird es einen Timeout-Fehler werfen?

Diese Frage bezieht sich auf Stackoverflow question.

+1

Dies sollte Ihre Frage beantworten: [Was ist der Unterschied zwischen SqlCommand.CommandTimeout und SqlConnection.ConnectionTimeout?] (Http://stackoverflow.com/questions/847264/what-is-the-difference-between-sqlcommand-commandtimeout -und-sqlconnection-conne) –

+0

Meine Frage ist etwas anders. SqlConnection.ConnectionTimeout dient zum Zeitlimit zum Öffnen der Verbindung. Ich möchte maximale Zeit für das Lesen aller Datensätze (die gesamte Zeit, die die While-Schleife dauern kann) auferlegen. – murtazat

+0

Was ist deine Argumentation für die maximale Zeit? Was hat Sie zu dem Schluss geführt, dass Sie eine maximale Zeitüberschreitung implementieren müssen? –

Antwort

2

Ich möchte Timeout so einstellen, dass ich eine maximale Timeout für alle Datensätze auferlegen kann. Ist eine Verbindungszeitüberschreitung eine gute Sache dafür?

Nein - ein Verbindungszeitlimit ist die maximale Anzahl, die benötigt wird, um eine Verbindung zu öffnen. Es hat nichts mit Operationen zu tun, nachdem eine Verbindung hergestellt wurde.

. Das heißt, wenn Sie Read() erneut aufrufen, dauert es weitere 30 Sekunden.

Möglicherweise - es hängt davon ab, wie viele Netzwerkpakete jedes Lesen erfordert. Der Satz vor dem, den Sie angeben, lautet:

Diese Eigenschaft ist das kumulative Timeout (für alle Netzwerkpakete, die während des Aufrufs einer Methode gelesen werden) für alle Netzwerklesevorgänge während Befehlsausführung oder Verarbeitung der Ergebnisse . Zum Beispiel, mit einem 30-Sekunden-Timeout, wenn Read zwei Netzwerkpakete benötigt, dann hat es 30 Sekunden, um beide Netzwerkpakete zu lesen.

Es ist möglich, dass alle Daten in einem Paket gelesen werden können und nur ein Netzwerk gelesen werden muss.

Wenn Sie ein Timeout für die while Schleife eine Variable hinzuzufügen, bräuchten und überprüfen Sie es in der while Schleife:

DateTime maxTime = DateTime.Now.AddSeconds(timeout) 
while(rdr.Read()) 
{ 
    if(DateTime.Now > maxTime) 
    // do something 
} 

Ich würde auch das Einwickeln der Verbindung, Befehl in die Gewohnheit, und Leser in using Blöcke, so dass sie entsorgt werden, sobald Sie mit ihnen fertig sind.