13 Stimmen

Wie kann man die Zeit für die Ausführung von Sql-Abfragen in web.config erhöhen?

Wenn ich eine Abfrage in der Webanwendung ausführe, erhalte ich eine null Wert. Dieselbe Abfrage direkt in SQL Management Studio liefert Ergebnisse.

Ich denke, dass das Problem eine Zeitüberschreitung ist. Wie kann ich die Zeit für die Ausführung der Abfrage in der Webanwendung erhöhen? In meiner web.config : connectionstring gibt es keinen Code für Timeout. Wenn ich dort eine Zeitüberschreitung wähle, wird sich das auf andere Teile meines Systems auswirken?

13voto

Sie können eine Sache tun.

  1. Erstellen Sie in der AppSettings.config (falls nicht vorhanden, erstellen Sie eine) ein Schlüssel-Wert-Paar.
  2. Im Code ziehen Sie den Wert, wandeln ihn in Int32 um und weisen ihn command.TimeOut zu.

wie:- In appsettings.config ->

<appSettings>    
   <add key="SqlCommandTimeOut" value="240"/>
</appSettings>

Im Code ->

command.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);

Das sollte genügen.

Anmerkung:- Ich konfrontiert die meisten der Timeout-Probleme, wenn ich SqlHelper Klasse von Microsoft Application Blocks verwendet. Wenn Sie es in Ihrem Code haben und mit Timeout-Problemen konfrontiert sind, sollten Sie besser sqlcommand verwenden und dessen Timeout wie oben beschrieben einstellen. Für alle anderen Szenarien sollte sqlhelper ausreichen. Wenn Ihr Kunde damit einverstanden ist, etwas länger zu warten, als es die Klasse sqlhelper bietet, können Sie die oben beschriebene Technik verwenden.

Beispiel:- Verwenden Sie diese -

 SqlCommand cmd = new SqlCommand(completequery);

 cmd.CommandTimeout =  Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);

 SqlConnection con = new SqlConnection(sqlConnectionString);
 SqlDataAdapter adapter = new SqlDataAdapter();
 con.Open();
 adapter.SelectCommand = new SqlCommand(completequery, con);
 adapter.Fill(ds);
 con.Close();

Anstelle von

DataSet ds = new DataSet();
ds = SqlHelper.ExecuteDataset(sqlConnectionString, CommandType.Text, completequery);

Update: Siehe auch die Antwort von @Triynko weiter unten. Es ist wichtig, auch das zu überprüfen.

3voto

Jeremy McGee Punkte 24034

SQL Server hat keine Einstellung zur Steuerung der Abfragezeitüberschreitung in der Verbindungszeichenfolge, und soweit ich weiß, ist dies auch bei anderen großen Datenbanken der Fall. Aber das sieht nicht wie das Problem aus, das Sie sehen: Ich würde erwarten, dass eine Ausnahme ausgelöst wird

Fehler: System.Data.SqlClient.SqlException: Zeitüberschreitung abgelaufen. Der Timeout-Zeitraum ist abgelaufen, bevor der Vorgang abgeschlossen wurde, oder der Server antwortet nicht.

wenn es tatsächlich eine Zeitüberschreitung bei der Ausführung der Abfrage gab.

Sollte sich dies als Problem erweisen, können Sie das Standard-Timeout für eine SQL Server-Datenbank als Eigenschaft der Datenbank selbst ändern; verwenden Sie dazu den SQL Server Manager.

Stellen Sie sicher, dass die Abfrage genau von Ihrer Webanwendung aus die gleichen Informationen wie die, die Sie direkt ausführen. Verwenden Sie einen Profiler, um dies zu überprüfen.

3voto

kesse Punkte 160

Ich weiß, dass ich ein bisschen spät dran bin, aber ich habe gerade über einen Tag damit verbracht, die Zeitüberschreitung eines Webservice zu ändern. Es schien ein Standard-Timeout von 30 Sekunden zu haben. Ich nach dem Ändern evry anderen Timeout-Wert, den ich finden konnte, einschließlich:

  • DB-Verbindungszeichenfolge Connect Timeout
  • httpRuntime executionTimeout
  • basicHttpBinding-Bindung closeTimeout
  • basicHttpBinding-Bindung sendTimeout
  • basicHttpBinding-Bindung receiveTimeout
  • basicHttpBinding-Bindung openTimeout

Schließlich fand ich heraus, dass es die SqlCommand-Zeitüberschreitung war, die standardmäßig auf 30 Sekunden eingestellt war.

Ich beschloss, die Zeitüberschreitung der Verbindungszeichenfolge einfach auf den Befehl zu übertragen. Die Verbindungszeichenfolge wird in der web.config konfiguriert.

Irgendein Code:

namespace ROS.WebService.Common
{
  using System;
  using System.Configuration;
  using System.Data;
  using System.Data.SqlClient;

  public static class DataAccess
  {
    public static string ConnectionString { get; private set; }

    static DataAccess()
    {
      ConnectionString = ConfigurationManager.ConnectionStrings["ROSdb"].ConnectionString;
    }

    public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] sqlParams)
    {
      using (SqlConnection conn = new SqlConnection(DataAccess.ConnectionString))
      {
        using (SqlCommand cmd = new SqlCommand(cmdText, conn) { CommandType = cmdType, CommandTimeout = conn.ConnectionTimeout })
        {
          foreach (var p in sqlParams) cmd.Parameters.Add(p);
          cmd.Connection.Open();
          return cmd.ExecuteNonQuery();
        }
      }
    }
  }
}

Änderung eingeführt, um den Timeout-Wert aus der Verbindungszeichenfolge zu "duplizieren": CommandTimeout = conn.ConnectionTimeout

2voto

ibo.ezhe Punkte 642

Sie sollten die httpRuntime blockieren und behandeln executionTimeout (in Sekunden).

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
 <system.web>
   <httpRuntime executionTimeout="90" maxRequestLength="4096"
    useFullyQualifiedRedirectUrl="false"
    minFreeThreads="8"
    minLocalRequestFreeThreads="4"
    appRequestQueueLimit="100" />
 </system.web>
... 
</configuration>

Weitere Informationen finden Sie unter msdn-Seite .

1voto

Muhammad Akhtar Punkte 51432

Ich denke, Sie können die Zeit für die Ausführung der Abfrage nicht erhöhen, aber Sie müssen das Timeout für die Anfrage erhöhen.

Ausführungszeitüberschreitung Legt die maximale Anzahl von Sekunden fest, die eine Anfrage ausgeführt werden darf, bevor sie automatisch von ASP.NET BEENDET WIRD. (Die Standardzeit beträgt 110 Sekunden.)

Für Details, bitte schauen Sie unter https://msdn.microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

Sie können in der web.config. z.B.

<httpRuntime maxRequestLength="2097152" executionTimeout="600" />

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