web-dev-qa-db-ger.com

Wie kann die Zeit in web.config für die Ausführung der SQL-Abfrage erhöht werden?

Beim Ausführen einer Abfrage in einer Webanwendung erhalte ich einen null-Wert. Dieselbe Abfrage direkt in SQL Management Studio gibt Ergebnisse zurück. 

Ich denke, das Problem ist ein Timeout. Wie kann ich die Ausführungszeit für eine Abfrage in einer Webanwendung erhöhen? In meiner web.config: connectionstring gibt es keinen Code für das Timeout. Wenn ich dort ein Timeout wähle, hat dies Auswirkungen auf andere Teile meines Systems? 

9
Jui Test

Sie können eine Sache tun.

  1. Erstellen Sie in der AppSettings.config (erstellen Sie eine, falls nicht vorhanden) ein Schlüsselwertpaar.
  2. Ziehen Sie im Code den Wert und konvertieren Sie ihn in Int32, und weisen Sie 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 es tun.

Hinweis: - Bei der Verwendung der SqlHelper-Klasse aus Microsoft-Anwendungsblöcken trat ich bei den meisten Timeout-Problemen auf. Wenn Sie es in Ihrem Code haben und Timeout-Probleme haben, sollten Sie sqlcommand verwenden und sein Timeout wie oben beschrieben einstellen. Für alle anderen Szenarien sollte sqlhelper gut funktionieren. Wenn Ihr Kunde mit dem Warten etwas länger als die von sqlhelper angebotene Klasse in Ordnung ist, können Sie die obige Technik anwenden.

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();

Anstatt 

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

Update: Siehe auch @Triynko Antwort unten. Es ist wichtig, dies auch zu überprüfen.

11
user3328730

Sie sollten den httpRuntime-Block hinzufügen und mit executionTimeout (in Sekunden) umgehen.

<?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 page .

3
ibo.ezhe

SQL Server hat keine Einstellung zum Steuern des Abfragezeitlimits in der Verbindungszeichenfolge. Soweit ich weiß, ist dies für andere Hauptdatenbanken gleich. Das sieht jedoch nicht nach dem Problem aus, das Sie sehen: Ich würde erwarten, dass eine Ausnahme ausgelöst wird 

Fehler: System.Data.SqlClient.SqlException: Zeitüberschreitung abgelaufen. Das Zeitlimit, das vor dem Abschluss des Vorgangs abgelaufen ist, oder der Server antwortet nicht.

wenn es wirklich einen Timeout gab, der die Abfrage ausführte.

Wenn sich dies als Problem herausstellt, können Sie das Standardzeitlimit 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 die gleiche ist, die Sie direkt in Ihrer Webanwendung verwenden. Verwenden Sie einen Profiler, um dies zu überprüfen.

3
Jeremy McGee

Ich weiß, dass ich etwas spät dran bin, aber ich habe gerade einen Tag damit verbracht, das Timeout eines Webservices zu ändern. Es schien ein Standard-Timeout von 30 Sekunden zu haben. Nachdem ich jeden anderen Timeout-Wert geändert hatte, konnte ich Folgendes finden:

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

Endlich fand ich, dass es das SqlCommand-Timeout war, das standardmäßig auf 30 Sekunden eingestellt war.

Ich beschloss, das Timeout der Verbindungszeichenfolge nur mit dem Befehl zu duplizieren. .__ Die Verbindungszeichenfolge wird in der web.config konfiguriert.

Etwas 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

1
kesse

Ich denke, Sie können die Zeit für die Abfrageausführung nicht erhöhen, aber Sie müssen das Zeitlimit für die Anforderung erhöhen.

Ausführungszeitlimit Gibt die maximale Anzahl von Sekunden an, die eine Anforderung ausführen darf, bevor sie automatisch von .__ heruntergefahren wird. ASP.NET. (Die Standardzeit beträgt 110 Sekunden.)

Weitere Informationen finden Sie unter https://msdn.Microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

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

<httpRuntime maxRequestLength="2097152" executionTimeout="600" />
1
Muhammad Akhtar