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

Windows Forms Discussion :

[C#] Gérer correctement des retours de SqlDataReader null


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut [C#] Gérer correctement des retours de SqlDataReader null
    Bonjour,
    Pour executer mes requetes j'utilise une classe crée par mes soins dont voici le code pour une requete de type select
    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
     
    public SqlDataReader QueryRequete()
            {
                ValidationStrRequete();
                SqlCommand Command = new SqlCommand(this.sRequete, cConnection.cpCurseur);
                OpenConnection();
                try
                {
                    return Command.ExecuteReader();
                }
                catch (SqlException ex)
                {
                    ViewException(ex);
                    return null;
                }
            }
    Le problème avec cela est que dans mon code pour mes applis je récupère le SqlDataReader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SqlDataReader drTriplet = cGpe.QueryRequete();
    Le problème : Lorsque la requete échoue pour un problème de connection, de string de requete incorrecte etc... j'ai un retour "null" et cela dans mon code ce n'est pas beau à gérer
    J'ai ma méthode ViewException qui va m'afficher le message d'erreur mais après cela je n'ai aucun blocage de l'application.
    Elle va récupérer le SqlDataReader null et essayer (impossible) de travailler avec.
    J'avais bien mis des tests drReader.HasRows après la récupération et avant l'execution de mon code mais je n'avais pas pensé au drReaer != null ....
    Et vu le nombre de Reader que je récupère je em demande si c'est vraiment efficace de rajouter le != null ou depuis la méthode QueryRequete() directement de faire un autre retour, ou bloquer le programme, relancer en début de méthode appelante, retourner sur le form ou quelque chose dans le genre.... le plus effice pour l'utilisateur en fait.

    Merci pour vos idée.

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161

  3. #3
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut
    Hummmm dans l'idée ça me plait, amis j'ai également besoin de faire une vérification sur l'objet Reader lui même.
    Que certaine valeurs soit null, je le gère par la requete elle même qui effectue (par une moulinette) des isnull(Champs,-1) ou isnull(Champs,'NA) en focntion du type (automatique).

    Le problème est lorsuqe la requete échoue, ma méthode d'execution de requete va renvoyer null (ce qui est loin d'être une bonne idée mais je ne sais pas quoi mettre d'autre pour le moment). Et au moment de l'assignation je vais avoir mon SqlDataReader Null lui même, et non ses valeurs.
    L'idéal serait qu'au lieu de renvoyer null ma méthode d'execution de requete bloque mon programme.

    Merci

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Salut

    Pourquoi ne travailles tu pas avec un DataSet que tu rempli s'il y a des valeurs au retour de la requete, sinon tu l'initialise à null.

    En plus c'est relativement simple à utiliser pour faire de l'affichage.

    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
     
    public DataSet QueryRequete()
            {
                ValidationStrRequete();
                SqlDataReader sqlTemp ;
                DataSet dsTemp = new DataSet ("Table") ;
                SqlCommand Command = new SqlCommand(this.sRequete, cConnection.cpCurseur);
                OpenConnection();
     
                 sqlTemp = Command.ExecuteReader();
     
                if(sqlTemp != null)
                {
                  DataRow drTemp = dsTemp.Tables[0].NewRow();
                  drTemp["champs1"] = drTemp.IsDBNull( drTemp.GetOrdinal( "Champs1" ) ) ?
                      drTemp.GetString( m_oDataReader.GetOrdinal( "Champs1" ) ) : "";
                  //tu recommence pour tous les champs qui sont contenus dans drTemp    
                }
                else
                  dsTemp = null;
     
               return dsTemp;            
     
            }

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Seconde solution :


    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
     
    public DataSet QueryRequete()
            {
                ValidationStrRequete();
                SqlDataReader sqlTemp ;
                DataSet dsTemp = new DataSet ("Table") ;
                SqlCommand Command = new SqlCommand(this.sRequete, cConnection.cpCurseur);
                OpenConnection();
     
                 sqlTemp = Command.ExecuteReader();
     
                if(sqlTemp != null)
                {
                  DataRow drTemp = dsTemp.Tables[0].NewRow();
                  drTemp["champs1"] = drTemp.IsDBNull( drTemp.GetOrdinal( "Champs1" ) ) ?
                      drTemp.GetString( m_oDataReader.GetOrdinal( "Champs1" ) ) : "";
                  //tu recommence pour tous les champs qui sont contenus dans drTemp    
                }
                else
                  throw new Exception ("Erreur lors de l'execution de la requete SQL");
     
               return dsTemp;            
     
            }
    Dans ce cas tu extploites l'erreur dans la focntion appelante.

    Cordialement
    Rockcoeur

  6. #6
    Membre Expert Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Par défaut
    Je me sert de ces méthodes un peu partout dans mon code, et d'après tout ce que j'avais pu lire, les DataSet étaient plutôt déconseillé par rapport à l'utilisation mémoire etc...
    Ensuite à ce que j'ai compris le DataSet ici reviens un peu à une DataTable, pour lesquelles j'ai une méthode qui me les crée, au besoin.
    Méthode bien générique qui va s'occuper du nombre de colonnes, de lignes, du nom des colonnes etc...
    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
     
    public static DataTable GetTableFromDReader(SqlDataReader drReader)
            {
                DataTable dtTable = new DataTable();
     
                int iNbrCol = drReader.FieldCount;
                int iNumCol = 0;
                do
                {
     
                    DataColumn Colonne = new DataColumn(drReader.GetName(iNumCol));
                    dtTable.Columns.Add(Colonne);
                    iNumCol += 1;
                } while (iNumCol < iNbrCol);
     
                int iNumLigne = 0;
                //Crée, Ajoute et Remplit les lignes
                while (drReader.Read())
                {
                    DataRow ligne = dtTable.NewRow();
                    dtTable.Rows.Add(ligne);
                    iNumCol = 0;
                    do
                    {
                        dtTable.Rows[iNumLigne][iNumCol] = drReader.GetValue(iNumCol);
                        iNumCol += 1;
                    } while (iNbrCol > iNumCol);
                    iNumLigne += 1;
                }
                return dtTable;
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/05/2013, 19h56
  2. [.NET 2.0] Comment gérer correctement des sockets ?
    Par MattC dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/02/2006, 16h31
  3. Réponses: 4
    Dernier message: 27/02/2005, 21h43
  4. Utiliser awk pour supprimer des retours charrios
    Par tomsoyer dans le forum Linux
    Réponses: 3
    Dernier message: 03/01/2005, 18h27
  5. [ENCODAGE][JAVA]Afficher correctement des accents
    Par kornelius dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/02/2004, 16h37

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