IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de performances avec l'instruction executeReader()


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut Problème de performances avec l'instruction executeReader()
    Bonjour à tous,

    Je travaille sous SQL2000 et C#. Mon problème est simple: quand j'execute une procédure stockée avec la méthode ExecuteReader, j'ai de gros problèmes de temps de performance (je me fais même jeter par le timeout) alors que quand j'execute la même requete depuis l'analyseur, elle s'execute en quelques secondes.

    Voilà mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
          public static DataSet Execute(string strSQL, SqlParameterCollection args, String Table)
            {
                DataSet dataset = new DataSet();
                string NomTable = Table;
                SqlDataReader oReader;
                // oReader = null;
                try
                {
                    string connectString = @"Server=monserveur;Initial Catalog=mabase;User Id=login;Password=passwd;";
                    using (SqlConnection cn = new SqlConnection(connectString))
                    {
                        cn.Open();
                        int i;
                        SqlCommand cmd = new SqlCommand(strSQL, cn);
                        for (i = 0; i < args.Count; i++)
                        {
                            cmd.Parameters.AddWithValue(args[i].ParameterName, args[i].Value);
     
                        }
     
                        cmd.CommandType = CommandType.StoredProcedure;
                        oReader = cmd.ExecuteReader(); //C'est sur cette instruction que c'est long!
                        i = 2; //numerotation des tables en cas de renvoi de plusieurs select par la procedure
                        while (oReader.IsClosed.Equals(false))
                        {
     
                            dataset.Load(oReader, LoadOption.PreserveChanges, NomTable);
                            NomTable = Table + i.ToString();
                            i++;
                        }
                        cn.Close();
                        cmd.Dispose();
                        oReader.Dispose();
                    }
                }
                catch (Exception e)
                {
                    //gestion
                }
                return dataset;
            }
    J'ai passé un moment à chercher et ai essayé plusieurs solutions mais rien n'y fait pour le moment.

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Bonjour

    tu peux nous founir le détails de l'exception, cad , le stack trace, et l'inner exception s'il existe

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Bonjour

    L'exception je n'en ai pas vraiment, cela dépend juste du volume de données que je considère. J'ai une exception quand le volume de données devient trop grand et que du coup le timeout se déclenche:

    Mais comme je suis pas contrariant voilà le stack trace:
    à System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) à
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) à
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
    stateObj) à System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
    SqlCommand cmdHandler, SqlDataReader dataStream,
    BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) à
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() à
    System.Data.SqlClient.SqlDataReader.get_MetaData() à
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
    RunBehavior runBehavior, String resetOptionsString) à
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
    cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
    async) à
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
    cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method,
    DbAsyncResult result) à
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
    cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
    à System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
    behavior, String method) à
    System.Data.SqlClient.SqlCommand.ExecuteReader() à
    ProtoWebus.Commun.Classes.SqlManagement.Execute(String strSQL,
    SqlParameterCollection args, String Table) dans H:\Developpement\Sources
    \monprojet\Commun\Classes\SqlManagement.cs:ligne 41
    et l'exception:

    Expiration du délai d'attente. Le délai d'attente s'est écoulé avant la
    fin de l'opération ou le serveur ne répond pas. L'instruction a été arrêtée.
    Ce qui est long c'est l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oReader = cmd.ExecuteReader();
    mais je ne comprends pas pourquoi car la requête executée sur l'analyseur de requêtes SQL s'execute en 2 à 3 secondes...

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Est ce que le problème réside juste à l'appel de cette procédure stockée ?

    je veux dire , t' pas essayé d'autre procédure stockées, juste pour vérifier si le problème vient pas de là.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Par défaut
    Si, j'ai essayé avec une autre et j'ai le même problème: le temps d'exécution avec le executeReader est bien plus grand que l'execution va l'analyseur de requetes.

    A noter que le résultat renvoyé est bon, mais au niveau des perfs c'est à coucher dehors

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2007, 19h02
  2. Réponses: 7
    Dernier message: 26/04/2007, 09h11
  3. Réponses: 8
    Dernier message: 11/02/2006, 23h36
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo