7 Stimmen

Ändern Sie den Standard-SqlCommand CommandTimeout mit der Konfiguration, anstatt neu zu kompilieren?

Ich unterstütze eine ASP.Net 3.5-Webanwendung, und bei den Benutzern tritt nach 30 Sekunden ein Timeout-Fehler auf, wenn sie versuchen, einen Bericht auszuführen. Wenn ich mich im Web umsehe, scheint es einfach zu sein, die Zeitüberschreitung im Code zu ändern. Leider bin ich nicht in der Lage, auf den Code zuzugreifen und ihn neu zu kompilieren. Gibt es eine Möglichkeit, die Standardeinstellung für die Webanwendung, den Arbeitsprozess, IIS oder den gesamten Rechner zu konfigurieren?

Hier ist der Stack-Trace bis zu dem Punkt, wo es in System.Data ist, für den Fall, dass ich ein anderes Problem übersehen:

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
  System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1948826
  System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844747
  System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
  System.Data.SqlClient.SqlDataReader.get_MetaData() +83
  System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
  System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
  System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
  System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162
  System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +115

--Edit

Es muss etwas außerhalb des Codes selbst liegen - ich habe die Datenbank heruntergeladen und sie gegen dieselbe Website auf einem Testserver laufen lassen, und sie läuft länger als 30 Sekunden und liefert den Bericht. Ich habe die Dateien machine.config und web.config aus dem .Net-Verzeichnis auf dem Live- und dem Testserver verglichen und sie scheinen identisch zu sein. Ich habe auch die beiden IIS-Setups verglichen und mir die SQL-Server-Konfiguration angesehen, und der einzige Unterschied ist, dass der Live-Server auf einem 64-Bit-W2K3-Cluster läuft, während der Testserver auf 32-Bit läuft.

15voto

Dan F Punkte 11764

Leider sagt alles, was ich bisher darüber gelesen habe, dass dies nicht über die Konfiguration gesteuert werden kann. Was sehr schade ist.

3voto

Radu094 Punkte 27290

Sie können die Befehlszeitüberschreitung leider nicht über die Verbindungszeichenfolge oder eine externe Einstellung festlegen.

Manchmal interpretiert ein Treiber den "Timeout"-Parameter in der Verbindungszeichenfolge sowohl als "Connect Timeout" als auch als "Command Timeout"-Periode, aber das ist technisch gesehen ein "Bug". Man muss die Standards einfach lieben.

2voto

JoshBerke Punkte 64214

Das Beste, was ich weiß, ist, dass Sie eine Verbindungszeitüberschreitung in der Verbindungszeichenfolge festlegen können, die steuert, wie lange ADO wartet, während es versucht, eine Verbindung zu SQL Server herzustellen, und die sich nicht auf die Befehlszeitüberschreitung auswirkt.

Ich persönlich finde, dass es eine Möglichkeit geben sollte, diese Einstellung zu ändern. Angenommen, die Baugruppe, in der dies ist nicht stark benannt Ihre beste Wette sein könnte, um den Code zurückentwickeln ändern Sie die Quelle und neu bereitstellen der Baugruppe mit dem neuen Namen.

0voto

James Z. Punkte 119

Es ist aber nicht allzu schwer, seine eigene Rolle zu drehen? Erstellen Sie einfach eine benutzerdefinierte SqlCommandTimeout-Einstellung unter AppSettings. Wenn Sie bereits eine Art von SqlCommandFactory verwenden, um Ihren SqlCommand zu erstellen, oder eine Art von SqlCommand-Basisklasse haben, können Sie die Änderung leicht vornehmen. Wenn nicht, dann ist Ihnen Ihr Code wahrscheinlich nicht wichtig genug, um dies in eine Konfigurationsdatei zu schreiben.

Herzliche Grüße, James

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X