Ich erhalte diesen Fehler:
Zeitlimit abgelaufen Das Zeitlimit ist vor dem Abschluss des Vorgangs abgelaufen oder der Server reagiert nicht.
Ich weiß, dass es bereits Anleitungen gibt, die helfen, das Problem zu lösen, aber sie arbeiten nicht für mich. Was fehlt mir oder wo sollte ich diesen SQL-Anweisungen in meinem C # -Programm den Code hinzufügen:
%Vor%Ich erhalte den Timeout-Fehler in dieser Zeile:
%Vor%Sie versuchen, eine Verbindung zu einem SQL Server herzustellen, und es dauert länger als ADO.NET bereit ist zu warten.
Versuchen Sie, mithilfe von SQL Server Management Studio eine Verbindung zum selben Server mit demselben Benutzernamen und demselben Kennwort herzustellen. Wenn derselbe Fehler auftritt, liegt entweder ein Fehler in der Verbindungszeichenfolge vor, der von Ihnen angegebene Server wird nicht ausgeführt, oder Sie können nicht über das Netzwerk von Ihrem Standort aus auf den Server zugreifen (möglicherweise handelt es sich um eine öffentliche IP-Adresse) Adresse versuchen, zu einem internen Servernamen zu gelangen). Ich kann mir kein Szenario vorstellen, in dem Sie exakt den gleichen Server und die gleichen Anmeldeinformationen in SSMS eingeben und eine Verbindung herstellen, dann dasselbe in ADO.NET ausführen und fehlschlagen.
Wenn Sie sich in einem langsamen Netzwerk befinden, können Sie versuchen, den Zeitüberschreitungswert zu erhöhen. Wenn jedoch überhaupt eine Verbindung zustande kommt, sollte das ziemlich schnell passieren.
Sehen Sie sich sowohl Ihre SQL Server Native Client-Einstellungen als auch die SQL Server-Einstellungen auf dem Server an. Es gibt einen Abschnitt für erlaubte Protokolle; SQL kann eine Verbindung mit einer Vielzahl von Protokollen herstellen. Normalerweise möchten Sie TCP / IP für einen Server im Netzwerk und Named Pipes für einen Server, der auf Ihrem eigenen Computer ausgeführt wird.
BEARBEITEN SIE IHREN KOMMENTAR: Oh, das ist normal; es passiert die ganze Zeit. Von Zeit zu Zeit kollidieren Pakete in einem TCP-Netzwerk oder gehen bei der Übertragung verloren. Es ist eine bekannte Schwäche von Paketvermittlungstechnologien, die in den meisten Fällen vom TCP-Protokoll selbst verwaltet wird. Ein Fall, in dem es nicht leicht erkannt wird, ist, wenn die anfängliche Anforderung nach einer Verbindung in dem Mischen verloren gegangen ist. In diesem Fall weiß der Server nicht, dass eine Anfrage eingegangen ist, und der Client wusste nicht, dass seine Anfrage nicht empfangen wurde. Der Client kann also alles geben.
Um Ihr Programm robuster zu machen, müssen Sie nur ein oder zwei Fehler erwarten und Ihre Anfrage einfach erneut versuchen. Hier ist ein grundlegender Algorithmus:
%Vor%Da der genaue Befehl zum Erhöhen des Verbindungstimeouts in den anderen Antworten (noch) nicht erwähnt wurde - wenn Sie das Verbindungszeitlimit erhöhen möchten, würden Sie dies in Ihrer Verbindungszeichenfolge wie folgt tun:
%Vor%Wo 120 = 120 Sekunden. Standard ist 20 oder 30, wie ich mich erinnere.
Dies ist wahrscheinlich ein Verbindungsproblem mit Ihrer Datenbank, beispielsweise wenn Sie die folgende Verbindungszeichenfolge hatten:
%Vor%Dann müssen Sie sicherstellen, dass:
MyDatabaseServer
ist mit dem Netzwerk verbunden und kann von der Maschine aus aufgerufen werden, auf der Sie Ihre Anwendung ausführen (unter dem Namen "MyDatabaseServer") MyDatabaseServer
MyDatabaseServer
ist so konfiguriert, dass er Verbindungen von fernen Rechnern akzeptiert MyDatabaseServer
sind korrekt eingerichtet, um SQL Server-Verbindungen über Sie können auch versuchen, eine Verbindung zur angegebenen Datenbankinstanz herzustellen, indem Sie SQL Server Management Studio auf dem Clientcomputer als Diagnoseschritt verwenden.
Es gibt viele Artikel, die sich mit Konnektivitätsproblemen bei SQL Server beschäftigen - führen Sie eine Google-Suche nach der spezifischen Fehlermeldung durch, die bei einer bestimmten Frage auf auftritt Serverfehler
Konfrontiert mit diesem Problem vor kurzem und fand die Auflösung, die für mich funktionierte .
Übrigens half das Setzen von Timeout = 0
, die Ausnahme zu vermeiden, aber die Ausführungszeit war unangemessen, während die manuelle Ausführung der Speicherprozedur ein paar Sekunden dauerte.
Unterste Zeile:
Ich habe SET IMPLICIT_TRANSACTIONS OFF
zur gespeicherten Prozedur hinzugefügt, die zum Füllen des Datensatzes verwendet wird.
Von MSDN:
Der SQL Server Native Client OLE DB-Provider für SQL Server und die SQL Server Native Client ODBC-Treiber automatisch festgelegt IMPLICIT_TRANSACTIONS bei Verbindung auf OFF. EINSTELLEN IMPLICIT_TRANSACTIONS ist standardmäßig auf OFF für Verbindungen mit dem Vom SQLClient verwalteter Provider und für SOAP-Anforderungen, die über HTTP-Endpunkte [...] Wenn SET ANSI_DEFAULTS auf ON gesetzt ist, ist SET IMPLICIT_TRANSACTIONS ON.
Ich glaube also, dass in meinem Fall die Vorgaben nicht so waren wie gefordert. (Ich konnte das nicht überprüfen. Verfügen nicht über ausreichende Berechtigungen für SQL Server). Aber das Hinzufügen dieser Zeile zu meinem SP löste das Problem.
WICHTIG: In meinem Fall brauchte ich die Transaktion nicht, daher hatte ich kein Problem, die Einstellung der impliziten Transaktion abzubrechen. Wenn in Ihrem Fall die Transaktion ein Muss ist, sollten Sie diese Lösung wahrscheinlich nicht verwenden.