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

ASP.NET Discussion :

SqlReader de plusieurs tuples avec plusieurs colonnes + lecture foreach dans ViewBag [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Points : 14
    Points
    14
    Par défaut SqlReader de plusieurs tuples avec plusieurs colonnes + lecture foreach dans ViewBag
    Bien le bonjour !

    Je suis actuellement en train de développer un site internet divisé en deux interfaces pour un projet personnel (chaque interface = 1 site mais les deux opèrent sur la même DB) le tout en mvc 5 et C#.
    La première interface dite client permet aux clients de se register, se login et créer des commandes qui sont stockées en base. Cette interface est déjà faite.

    Maintenant mon problème est que je ne parvient pas à récupérer toutes les commandes et à les stocker dans un tableau multidimensionnel de string pour l'interface admin.

    Par exemple j'ai actuellement 20 commandes de tests. Soit je relis tout le temps la même commande soit j'obtient un out of range ... :'(

    Voici ma table Commandes:

    Pièce jointe 216203

    Voici le code dans mon modèle Commande.cs:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    public string[,] getCommandes()
            {
                int size = 0;
                using (SqlConnection sqlCnx = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["cnx"].ConnectionString))
                {
                    sqlCnx.Open();
                    using (SqlCommand cmd = new SqlCommand(@"SELECT COUNT(id) FROM Commandes", sqlCnx))
                    {
                        cmd.CommandType = CommandType.Text;
                        using (SqlDataReader sqlrd = cmd.ExecuteReader())
                        {
                            sqlrd.Read();
                            size = sqlrd.GetInt32(0);
                            sqlrd.Close();
                            sqlCnx.Close();
                        }
                    }
                }
     
                string[,] cmdTab = new string[size, 13];//13 car 13 colonnes en table
                int cptLine = 0;
                int calc = size * 13;
                using (SqlConnection sqlCnx = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["cnx"].ConnectionString))
                {
                    sqlCnx.Open();
                    using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Commandes", sqlCnx))
                    {
                        cmd.CommandType = CommandType.Text;
                        using (SqlDataReader sqlrd = cmd.ExecuteReader())
                        {
                            while(sqlrd.Read())
                            {
                                for (int i = 0; i < size; i++)//pour chaque commande
                                {
                                    for (int cptRd = 0; cptRd < calc; cptRd++)//pour chaque colonne
                                    {
                                        switch (sqlrd.GetName(cptRd))
                                        {
                                            case "Id": cmdTab[cptLine, 0] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "Titre": cmdTab[cptLine, 1] = sqlrd.GetString(cptRd).ToString(); break;
                                            case "Style": cmdTab[cptLine, 2] = sqlrd.GetString(cptRd).ToString(); break;
                                            case "Description": cmdTab[cptLine, 3] = sqlrd.GetString(cptRd).ToString(); break;
                                            case "Longueur": cmdTab[cptLine, 4] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "Largeur": cmdTab[cptLine, 5] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "Budget": cmdTab[cptLine, 6] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "DateCmd":
                                                cmdTab[cptLine, 7] = sqlrd.GetDateTime(cptRd).ToString();
                                                String[] dateCoupee = cmdTab[cptLine, 7].ToString().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                                                cmdTab[cptLine, 7] = dateCoupee[0];
                                                String[] dateCoupee2 = cmdTab[cptLine, 7].ToString().Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                                                cmdTab[cptLine, 7] = dateCoupee2[1] + "/" + dateCoupee2[0] + "/" + dateCoupee2[2];
                                                break;
                                            case "Status": cmdTab[cptLine, 8] = sqlrd.GetString(cptRd).ToString(); break;
                                            case "Progress": cmdTab[cptLine, 9] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "PrixTeam": cmdTab[cptLine, 10] = sqlrd.GetInt32(cptRd).ToString(); break;
                                            case "Acheteur": cmdTab[cptLine, 11] = sqlrd.GetString(cptRd).ToString(); break;
                                            case "NomMap": cmdTab[cptLine, 12] = sqlrd.GetString(cptRd).ToString(); break;
                                        }
                                    }
                                    cptLine += 1;
                                }
                                    //cptCol += 1;
                            }
                            sqlrd.Close();
                            sqlCnx.Close();
                        }
                    }
                }
                return cmdTab;
            }
    Seulement voilà impossible d'aller plus loin qu'un seul tuple :/

    voici l'appel de la méthode depuis mon contrôleur CommandesController.cs dans mon ActionResult Index:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Commandes cmd = new Commandes();
        string[,] commandes = cmd.getCommandes();
        ViewBag.Commandes = commandes;
    De plus, je n'ai également aucune idée de comment afficher les données récupérées afin de les afficher sous forme de tableau dans ma vie via le ViewBag :/ Donc si vous aviez une idée je vous la pique volontiers hihi

    Bien cordialement et merci de m'avoir lu !
    Bad_Pop

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    tout d'abord tu ne devrais pas faire plusieurs fois la même demande, les admin vont pas aimer

    Sur ton code, quelques remarques :
    - pour ton SELECT COUNT tu peux faire un ExecuteScalar (renvoie la première colonne de la première ligne),
    - si tu te sers de using alors tu n'as pas besoin de faire les Close(),
    - perso, si ma fonction devait absolument renvoyer un tableau je créerais une classe représentant un tuple et je renverrais une List<maClasse>,
    - sinon je me démerderais pour faire directement mon traitement dans mon while read(),
    - en nommant explicitement tes champs dans le SELECT tu pourrais y accéder facilement via leur index, sans avoir à comparer des strings,
    - ton système de boucle dans ton Read() est un peu lourdingue (à un moment tu dois même être hors index).

    Pour l'affichage du tableau en ASP.NET c'est pas les choix qui manquent :
    - le DataGrid,
    - le tag HTML <table> (en direct dans un PlaceHolder ou via un user control),
    - le Repeater ...
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Je sais mais je n'étais pas dans le bon fofo je crois ^^

    Merci pour tes réponses je vais essayer ça dès que j'ai un peux de temps et que j'aurai du café

    Je reviens vers la discussion une fois que j'aurai essayé tout ça

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2016
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Résolu !
    Bien le bonsoir !!!

    Merci pour les indications j'ai finalement trouvé une solution adaptée à mon problème ! voici le code pour les intéressés

    Controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<CommandeClass> commandes = cmd.getCommandes();
    return View(commandes);

    Model:

    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
     
    public List<CommandeClass> getCommandes()
            {
                string id, style, titre, desc, longueur, largeur, budget, date, status, progress, prix, client, map, gdoc;
                List<CommandeClass> listeCommandes = new List<CommandeClass>();
                using (SqlConnection sqlCnx = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["cnx"].ConnectionString))
                {
                    sqlCnx.Open();
                    using (SqlCommand cmd = new SqlCommand(@"SELECT Id, Titre, Style, Description, Longueur, Largeur, Budget, DateCmd, Status, Progress, PrixTeam, Acheteur, NomMap, gdoc FROM  Commandes", sqlCnx))
                    {
                        using (SqlDataReader sqlrd = cmd.ExecuteReader())
                        {
                            while (sqlrd.Read())
                            {
                                id = sqlrd["Id"].ToString();
                                titre = sqlrd["Titre"].ToString();
                                style = sqlrd["Style"].ToString();
                                desc = sqlrd["Description"].ToString();
                                longueur = sqlrd["Longueur"].ToString();
                                largeur = sqlrd["Largeur"].ToString();
                                budget = sqlrd["Budget"].ToString();
                                date = sqlrd["DateCmd"].ToString();
                                status = sqlrd["Status"].ToString();
                                progress = sqlrd["Progress"].ToString();
                                prix = sqlrd["PrixTeam"].ToString();
                                client = sqlrd["Acheteur"].ToString();
                                map = sqlrd["NomMap"].ToString();
                                gdoc = sqlrd["gdoc"].ToString();
                                listeCommandes.Add(new CommandeClass {id = id, titre = titre, style = style, desc = desc, longueur = longueur, largeur = largeur, budget = budget, date = date, status = status, progress = progress, prix = prix, client = client, map = map, gdoc = gdoc});
                            }
                        }
                    }
                }
                return listeCommandes;
            }
    Ma classe commande:

    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
     
    public class CommandeClass
        {
            public string id;
            public string titre;
            public string style;
            public string desc;
            public string longueur;
            public string largeur;
            public string budget;
            public string date;
            public string status;
            public string progress;
            public string prix;
            public string client;
            public string map;
            public string gdoc;
        }
    La vue:

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    <div class="col-lg-12 table-responsive">
                            <table class="table table-bordered">
                                <thead>
                                    <tr class="bg-primary">
                                        <td><strong>Id</strong></td>
                                        <td><strong>Titre</strong></td>
                                        <td><strong>Style</strong></td>
                                        <td><strong>Description</strong></td>
                                        <td><strong>Longueur</strong></td>
                                        <td><strong>Largeur</strong></td>
                                        <td><strong>Budget</strong></td>
                                        <td><strong>Date</strong></td>
                                        <td><strong>Status</strong></td>
                                        <td><strong>Progression</strong></td>
                                        <td><strong>Prix</strong></td>
                                        <td><strong>Client</strong></td>
                                        <td><strong>Nom map</strong></td>
                                        <td><strong>Google Doc</strong></td>
                                    </tr>
                                </thead>
                                <tbody>
                                    @model List<CommandeClass>
                                    @foreach (var item in Model)
                                    {
                                        <tr>
                                            <td class="bg-success">@item.id</td>
                                            <td class="bg-info">@item.titre</td>
                                            <td class="bg-success">@item.style</td>
                                            <td class="bg-info">@item.desc</td>
                                            <td class="bg-success">@item.longueur</td>
                                            <td class="bg-info">@item.largeur</td>
                                            <td class="bg-success">@item.budget</td>
                                            <td class="bg-info">@item.date</td>
                                            <td class="bg-success">@item.status</td>
                                            <td class="bg-info">
                                                <div class="progress">
                                                    <div class="progress-bar progress-bar-danger progress-bar-striped active" role="progressbar" aria-valuenow='@item.progress' aria-valuemin="0" aria-valuemax="100" style="width:@item.progress%">
                                                        @item.progress %
                                                    </div>
                                                </div>
                                            </td>
                                            <td class="bg-success">@item.prix</td>
                                            <td class="bg-info">@item.client</td>
                                            <td class="bg-success">@item.map</td>
                                            <td class="bg-info">@item.gdoc</td>
                                        </tr>
                                    }
                                </tbody>
                            </table>
                        </div>

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/06/2014, 13h22
  2. Réponses: 9
    Dernier message: 07/03/2011, 16h18
  3. Réponses: 5
    Dernier message: 22/11/2010, 18h20
  4. Réponses: 6
    Dernier message: 14/11/2006, 10h35

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