2009-08-30 14 views
24

Ich verwende VSTS 2008 + ADO.Net + C# + .Net 3.5 + SQL Server 2008. Ich verwende ADO.Net auf Clientseite, um eine Verbindung zum Datenbankserver herzustellen, um eine Speicherprozedur auszuführen, und dann zurückzukehren Ergebnis aus der Speicherprozedur.Timeouteinstellung für SQL Server

Hier ist mein Code. Ich habe zwei Fragen über Timeout,

  1. Wenn ich ausdrücklich keine Timeout-bezogene Einstellungen festgelegt, für die Verbindung zum Datenbank-Server, gibt es Timeout-Einstellungen (zB wenn nicht für einige Standard-Menge an Datenbankserver verbinden von Zeit, gibt es einige Timeout-Ausnahme?)?

  2. Wenn ich für die Ausführung der Speicherprozedur keine timeout-bezogenen Einstellungen explizit festlege, gibt es irgendwelche Timeout-Einstellungen (z. B. wenn die Ergebnisse vom Server für einige Zeit nicht auf den ADO.Net-Client abgerufen werden können, es wird eine Zeitüberschreitung geben Ausnahme?)?

    using (SqlConnection currentConnection = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Trusted_Connection=true;Asynchronous Processing=true")) 
        { 
         // check current batch conut 
         currentConnection.Open(); 
         using (SqlCommand RetrieveOrderCommand = new SqlCommand()) 
         { 
          RetrieveOrderCommand.Connection = currentConnection; 
          RetrieveOrderCommand.CommandType = CommandType.StoredProcedure; 
          RetrieveOrderCommand.CommandText = "prc_GetOrders"; 
          RetrieveBatchCountCommand.Parameters.Add("@Count", SqlDbType.Int).Direction = ParameterDirection.Output; 
          RetrieveBatchCountCommand.ExecuteNonQuery(); 
          int rowCount = Convert.ToInt32(RetrieveOrderCommand.Parameters["@Count"].Value); 
         } 
        } 
    

Antwort

13

Ja, gibt es 2 Arten von Timeout

  1. Connection timeout
  2. Command timeout

Beide standardmäßig auf 30 Sekunden in VBA, .net usw. eingestellt werden kann

+0

Th anks gbn!Welche Arten von Ausnahmen werden ausgelöst oder mit anderen Worten, welche Arten von Ausnahmen sollten wir in unserem Code erfassen, um das Zeitlimitproblem zu beheben? – George2

+2

In SSMS, erhalte ich „Timeout abgelaufen. Die Timeout-Zeit vor dem Abschluss der Operation verstrichen ist, oder der Server nicht reagiert.“ Sie können mit WAITFOR DELAY '00: 00: 40 'testen, um eine Wartezeit von 40 Sekunden und eine Ausnahme für das Befehls-Timeout zu erzwingen. Für das Verbindungszeitlimit können Sie einen Servernamen erstellen und versuchen, eine Verbindung herzustellen. – gbn

+0

Danke, für die Zeitüberschreitung des Befehls, welche Art von Ausnahme sollte abgefangen werden? – George2

40

Wie gbn bereits erwähnt, gibt es zwei Arten von Timeouts:

1) Connection Timeout: Diese wird durch die Verbindungszeichenfolge gesteuert wird:

Data Source=.;Initial Catalog=TestDB; 
    Trusted_Connection=true;Asynchronous Processing=true 

Wenn Sie ein Connect Timeout=120 diese Zeichenfolge hinzuzufügen, Ihre Verbindung wird versuchen, für 120 Sekunden, um geöffnet zu werden und bricht dann ab.

Data Source=.;Initial Catalog=TestDB; 
    Trusted_Connection=true;Asynchronous Processing=true; 
    Connect Timeout=120; 

2) Befehl Timeout: für jeden Befehl, können Sie auch ein Timeout angeben - ADO.NET wird für diese Menge an Zeit warten, bevor Sie Ihre Abfrage aufhebt. Sie legen fest, dass auf dem SqlCommand Objekt:

using (SqlCommand RetrieveOrderCommand = new SqlCommand()) 
    { 
     RetrieveOrderCommand.CommandTimeout = 150; 
    } 
+9

Es könnte auch bemerkenswert, enthalten sein, dass die ‚Connect Timeout‘ Parameter in der Verbindungszeichenfolge auch den Time-out für die SqlTransaction.Commit Methode –

+0

Dank Marc steuern, welche Art von Ausnahme ausgelöst wird, oder mit anderen Worten, welche Arten von Ausnahme sollten wir unseren Code einfangen, um das Timeout-Problem zu beheben? – George2

+0

Dank Philip, meinst du neben der Verbindungszeit und Befehls-Timeout, gibt es eine dritte Art von Timeout-Transaktion Timeout genannt? – George2

0

In SQLConnection-Klasse gibt es eine Eigenschaft von Namen „Connection“ .Dieses kann nicht direkt gewünschte Verbindung Timeout-Wert eingestellt werden, da sie nur lesbar, dh nur „get“ sind implementiert & "set" ist nicht auf dieser Eigenschaft implementiert.So müssen wir das Schlüsselwort "Connection Timeout" in der Verbindungszeichenfolge selbst verwenden & den gewünschten Wert einstellen.

exi: "Data Source = (local); Initial Catalog = Adventureworks; Integrated Security = SSPI; Connection Timeout = 30"; (30 bedeutet 30 Sekunden)

30 Sekunden ist die maximale Zeit zu etablieren gegeben Verbindung zum Server (wie 172.160.0.2 ODER etwas wie ADMINISTRATOR \ SQLEXPRESS). Wenn es nicht sofort eine Verbindung zum Server herstellen konnte, wird es bis zu 30 Sekunden versuchen. Wenn Server gültig ist & ist in der Lage, Verbindung zum Server & wenn Datenbankname oder die Anmeldedaten ungültig sind, dann ist dieses Zeitlimit nicht anwendbar. Es wird sofort eine Ausnahme für ungültige Berechtigungsnachweise oder Datenbank ausgelöst