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

VB.NET Discussion :

Compter le Nombre de Ligne envoyer par Un Select : Oracle et VB.Net


Sujet :

VB.NET

  1. #1
    Membre confirmé Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut Compter le Nombre de Ligne envoyer par Un Select : Oracle et VB.Net
    Bonjour,

    Je veux compter le nombre des enregistrements de ma requête SQL. J'ai besoin en fait ce nombre pour que je puisse savoir combien de ligne que je dois tracer pour afficher le résultat de select dans un tableau.
    Alors, mon but est de pouvoir faire la selection, récupération des données et en même temps savoir nombre de lignes séléctionnées.

    Voilà le code que j'ai fait pour faire la séléction et aussi la récupération des données issues de la base donnée Oracle. j'ai essayé avec Count(*) mais ça marche pas :

    Comme vous voyez dans le code au lieu de 7 qui est le nombre de rows du tableau Data (je charge les données de la base donnée vers ce tableau), j'ai besoin de savoir le nombre des lignes pour pouvoir préciser la profondeur exacte du tableau Data.

    Ce qui est en bleu, c'est juste la façon contrôller combien de ligne on doit afficher par page
    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
    
    Private Function getData() As String(,)
            Dim Data(7, 3) As String
            Taille_Data = Data.GetLength(0) - 1
            nb_page = Int(Taille_Data / 4)
            If Taille_Data Mod 4 <> 0 Then
                nb_page += 1
            End If
    ---------------------- Chargement ------------------
            Dim oradb As String = "Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = Sisiniya-PC)(PORT = 1521))" _
        + "(CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = XE)));" _
        + "User Id=sisiniya;Password=123;"
    
            ' Create the connection with Oracle :-)
            Dim conn As New OracleConnection(oradb)
            Dim cmd As New OracleCommand
           
            Dim id_user As Integer
            id_user = 0
            Try
                conn.Open()
                Try
                    cmd.Connection = conn
                    cmd.CommandText = "select c.id_user,c.login_user,c.password_user,c.code_acces_user,p.nom_personnel, from comptes_users c natural join personnels p"
                    cmd.CommandType = CommandType.Text
                    Dim dr As OracleDataReader = cmd.ExecuteReader()
    
                    Do While dr.Read()
                        date_inscri = dr.GetDateTime(7)
                        Data(id_user, 0) = Convert.ToString(dr("login_user"))
                        Data(id_user, 1) = Convert.ToString(dr("password_user"))
                        Data(id_user, 2) = Convert.ToString(dr("code_acces_user"))
                        Data(id_user, 4) = Convert.ToString(dr("nom_personnel"))
                        id_user = id_user + 1
    
                    Loop
    
                    dr.Close()
                Catch ex As Exception
                    Console.WriteLine(ex.Message)
                End Try
            Catch ex As Exception
                Console.WriteLine("Sisiniya : Connection to Oracle database established failed :-( !")
            Finally
                cmd.Dispose() 'Dispose OracleCommand object
                ' Close and Dispose OracleConnection object
                conn.Close()
                conn.Dispose()
            End Try
                
            Return Data
        End Function


    S'il vous plaît, veuillez m'aider ...


    Merci d'avoir lu mon message jusqu'au bout.


    Sisiniya.

  2. #2
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Bonjour Sisiniya,

    Content de vous lire !

    Le problème est le suivant, lorsque vous réalisez un appel à la db pour renvoyer des rows, le mécanisme qui est en place (reader sur enregistrement) est similaire à un IEnumerable :
    Donc, un objet qui permet de renvoyer l'objet courant, et sait comment lire le suivant.

    Dans ce cadre, à moins de lire tous les enregistrements... (ou d'opter pour une stratégie qui dans la procédure stoquée, compte les lignes avant d'effectuer le select, et renvois dans les données retournées le nombre de lignes),
    à moins de lire tous les enregistrements... on est mal !

    Donc, il y a d'autres mécanismes en .net dont les listes fortement typées
    System.Collection.List<>
    ou les arraylist ...

    Ces objets sont dynamiques ! et donc, il n'est pas indispensable de préciser le nombre d'éléments avant de les retourner !

    Recherchez plutot dans cette voie là !
    en tous cas c'est mon avis ...
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  3. #3
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Petit conseil :
    Si votre application est une application "réelle", utilisée en entreprise,
    il est conseillé d'évite les notes d'humour dans les commentaires, les simleys etc ...
    Sisiniya : Connection to Oracle database established failed :-(
    (D'expérience, je sais que cela ne plait pas à tous le monde ... hélas ...)
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  4. #4
    Membre confirmé Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Merci benji_dv

    A propose de mon message d'erreur, ce sont en fait propre à moi, c'est juste dans mes testes que je m'amuse en utilisant ces notes. Merci beaucoup pour le conseil .

    J'ai essayé de compter premièrement le nombre de ligne envoyé. Mais ça marche pas . En fait, est ce que c'est possible de faire plusieurs requêtes , comme ce que j'ai fait (j'ai compté, puis j'ai fait le 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    Try
                    cmd.Connection = conn
                    cmd.CommandText = "select count(*) from comptes_users natural join personnels "
    
                    cmd.CommandType = CommandType.Text
                    Dim dr As OracleDataReader
                    dr = cmd.ExecuteReader()
    
                    Dim nbr_row As Integer
                    nbr_row = dr.GetInt16(0)
    
                    cmd.CommandText = "select c.id_user,c.login_user,c.password_user,c.code_acces_user,p.nom_personnel,p.prenom_personnel,p.cin_personnel,p.date_inscription_cite from comptes_users c natural join personnels p"                dr = cmd.ExecuteReader()
                    Do While dr.Read()
                        date_inscri = dr.GetDateTime(7)
                        Data(id_user, 0) = Convert.ToString(dr("login_user"))
                        Data(id_user, 1) = Convert.ToString(dr("password_user"))
                        Data(id_user, 2) = Convert.ToString(dr("code_acces_user"))
                        Data(id_user, 3) = Convert.ToString(date_inscri)
                        Data(id_user, 4) = Convert.ToString(dr("nom_personnel"))
                        Data(id_user, 5) = Convert.ToString(dr("prenom_personnel"))
                        Data(id_user, 6) = Convert.ToString(dr("cin_personnel"))
                        Data(id_user, 7) = Convert.ToString(dr("id_user"))
                        Data(id_user, 8) = "01/03/2008_1"
                        id_user = id_user + 1
    
                    Loop
    
                    dr.Close()
                Catch ex As Exception
                    MsgBox("GUC : " + ex.Message, MsgBoxStyle.Critical)
                End Try
    A l'exécution : Data(,) est vide n'a pas été rempli (je crois que la deuxième requete n'a pas été exécutée), et il m'a généré une Exception qui est :

    L'opération n'est pas valide en raison de l'état actuelle de l'objet

  5. #5
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    N'oubliez pas de placer (évenetuellement) un point d'arret (breakpoint) pour pouvoir visualiser l'erreur plus précisément.

    Néanmoins, entre le moment où vous récupérez le nombre de lignes et le moment ou vous remplissez Data(,), vous ommettez d'instancier le Data(,) avec le nombre d'éléments attendus.

    Je me permets d'insister : aujoud'hui en .net nous disposons de classes telles que ArrayList, ou Lis{Of type} permettant de simplement ajouter des éléments à la collection, sans préciser le nombre d'éléments au début du traitement.

    Ces liste sont dynamiques (leur taille augmente à la demande, automatiquement) du coup votre opération de comptage n'est pas nécessaire.

    Concernant les requetes SQL. Je suis pas spécialiste Oracle (suis plutot SQL Server), néanmoins :

    Count(*) => moins performant que Count(champ)
    en effet, en réalisant Count(*) vous demandez au moteur de Bdd de compter le nombre de lignes, pour les tous les champs => le moteur manipule tous les champs lors du comptage !
    En utilisant Count(NomD'unChamp) => le moteur ne va manipuler qu'un seul champ pour le comptage...

    Est ce normal que la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from comptes_users natural join personnels
    ne précise pas les champs concernés par le natural join ?
    (suis pas spécialiste oracle, donc je ne sais pas si syntaxiquement c'est correcte. En Sql Server, si vous utilisez les jointures, vous devez préciser quels champ joindre entre les 2 tables)
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  6. #6
    Membre confirmé Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Par défaut
    Pour la requête, c'est pas obligé de préciser les champs si on utilise le mot clé natural join (c'est automatiquement lui qui va faire la jointure suivant les champs qui sont en commun). --> En fait je l'ai exécuté ça ma donné le nombre 8 (qui est effectivement le bon nombre).


    Alors, pour votre proposition, je vais essayer de travailler avec les ArrayList comme vous m'avez dit.

    Merci une autre fois pour votre générosité dans vos réponses.

  7. #7
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Merci une autre fois pour votre générosité dans vos réponses.
    avec plaisir !
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

Discussions similaires

  1. [PDO] Compter le nombre de lignes d'une requête SELECT
    Par juJuv51 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/02/2008, 13h49
  2. Nombre de lignes renvoyées par un SELECT
    Par eowene dans le forum Zend Framework
    Réponses: 7
    Dernier message: 04/12/2007, 09h42
  3. Réponses: 1
    Dernier message: 28/11/2007, 09h13
  4. [PDO] Compter le nombre de lignes d'une requête SELECT
    Par WerKa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/06/2007, 20h57
  5. [C#] Comment connaître le nombre de lignes affectées par un Select ?
    Par diaboloche dans le forum Accès aux données
    Réponses: 6
    Dernier message: 21/09/2006, 13h56

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