OVH Cloud OVH Cloud

Nb de lignes de OracleDataReader ?

7 réponses
Avatar
Julien
L'objet OracleDataReader ne comporte pas de méthode .Count !
Comment connaître le nb d'enregistrements renvoyés ?

Merci à tous.

Code en exemple :

'Créé la liste à ajouter
Dim tabstr() As String

' Connexion à la base
Dim oOracleConn As OracleConnection = New OracleConnection

'Récupération des variables globales
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"
oOracleConn.Open()

' Exécution de la requête et récupération du résultat
Dim myCommand As New OracleCommand(reqSQL, oOracleConn)
Dim i As Integer = 0

Dim myReader As OracleDataReader =
myCommand.ExecuteReader(CommandBehavior.CloseConnection)
'TODO : trouver comment connaitre à l'avance le nb
d'enregistrements renvoyés !!!
-->> ReDim tabstr(myReader.COUNT)
While myReader.Read()
tabstr(i) = myReader.GetString(0)
i += 1
End While

' Deconnexion de la base
myReader.Close()
oOracleConn.Close()

7 réponses

Avatar
Zoury
Salut!

un DataReader ne connait pas sa taille.. si tu veux cette information,
remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le nombre
de ligne qu'il contient.

--
Cordialement
Yanick
MVP pour Visual Basic

"Julien" a écrit dans le message de
news:cr187h$e8j$
L'objet OracleDataReader ne comporte pas de méthode .Count !
Comment connaître le nb d'enregistrements renvoyés ?

Merci à tous.

Code en exemple :

'Créé la liste à ajouter
Dim tabstr() As String

' Connexion à la base
Dim oOracleConn As OracleConnection = New OracleConnection

'Récupération des variables globales
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"
oOracleConn.Open()

' Exécution de la requête et récupération du résultat
Dim myCommand As New OracleCommand(reqSQL, oOracleConn)
Dim i As Integer = 0

Dim myReader As OracleDataReader > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
'TODO : trouver comment connaitre à l'avance le nb
d'enregistrements renvoyés !!!
-->> ReDim tabstr(myReader.COUNT)
While myReader.Read()
tabstr(i) = myReader.GetString(0)
i += 1
End While

' Deconnexion de la base
myReader.Close()
oOracleConn.Close()




Avatar
Julien
Merci Zoury...
mais c qd mêm incroyable !
Ya pas plus simple que ça ?

Actuellement, je fais un redim de ma table à chaque boucle du Read() !
Pas top niveau performances qd même !!

Sinon, tu n'as pas un bout de code ?

Merci bcp


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:%
Salut!

un DataReader ne connait pas sa taille.. si tu veux cette information,
remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le nombre
de ligne qu'il contient.

--
Cordialement
Yanick
MVP pour Visual Basic

"Julien" a écrit dans le message de
news:cr187h$e8j$
> L'objet OracleDataReader ne comporte pas de méthode .Count !
> Comment connaître le nb d'enregistrements renvoyés ?
>
> Merci à tous.
>
> Code en exemple :
>
> 'Créé la liste à ajouter
> Dim tabstr() As String
>
> ' Connexion à la base
> Dim oOracleConn As OracleConnection = New


OracleConnection
>
> 'Récupération des variables globales
> oOracleConn.ConnectionString = "Data Source=" & Net8
> oOracleConn.ConnectionString += ";User Id=" & User
> oOracleConn.ConnectionString += ";Password=" & Mdp
> oOracleConn.ConnectionString += ";Integrated


Security=no"
> oOracleConn.Open()
>
> ' Exécution de la requête et récupération du résultat
> Dim myCommand As New OracleCommand(reqSQL, oOracleConn)
> Dim i As Integer = 0
>
> Dim myReader As OracleDataReader > > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> 'TODO : trouver comment connaitre à l'avance le nb
> d'enregistrements renvoyés !!!
> -->> ReDim tabstr(myReader.COUNT)
> While myReader.Read()
> tabstr(i) = myReader.GetString(0)
> i += 1
> End While
>
> ' Deconnexion de la base
> myReader.Close()
> oOracleConn.Close()
>
>




Avatar
Zoury
> Ya pas plus simple que ça ?
Actuellement, je fais un redim de ma table à chaque boucle du Read() !
Pas top niveau performances qd même !!



Le code n'est pas vraiment plus compliqué avec un DataAdapter et évidemment
il y a d'autres options. Avant de me mettre inventer des méthodes, dit moi
pourquoi tu dois obtenir un tableau de String ? Ne pourrais-tu pas travaillé
directement avec un datatable ?

--
Cordialement
Yanick
MVP pour Visual Basic


Sinon, tu n'as pas un bout de code ?

Merci bcp


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:%
> Salut!
>
> un DataReader ne connait pas sa taille.. si tu veux cette information,
> remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le


nombre
> de ligne qu'il contient.
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
> "Julien" a écrit dans le message de
> news:cr187h$e8j$
> > L'objet OracleDataReader ne comporte pas de méthode .Count !
> > Comment connaître le nb d'enregistrements renvoyés ?
> >
> > Merci à tous.
> >
> > Code en exemple :
> >
> > 'Créé la liste à ajouter
> > Dim tabstr() As String
> >
> > ' Connexion à la base
> > Dim oOracleConn As OracleConnection = New
OracleConnection
> >
> > 'Récupération des variables globales
> > oOracleConn.ConnectionString = "Data Source=" & Net8
> > oOracleConn.ConnectionString += ";User Id=" & User
> > oOracleConn.ConnectionString += ";Password=" & Mdp
> > oOracleConn.ConnectionString += ";Integrated
Security=no"
> > oOracleConn.Open()
> >
> > ' Exécution de la requête et récupération du résultat
> > Dim myCommand As New OracleCommand(reqSQL,


oOracleConn)
> > Dim i As Integer = 0
> >
> > Dim myReader As OracleDataReader > > > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> > 'TODO : trouver comment connaitre à l'avance le nb
> > d'enregistrements renvoyés !!!
> > -->> ReDim tabstr(myReader.COUNT)
> > While myReader.Read()
> > tabstr(i) = myReader.GetString(0)
> > i += 1
> > End While
> >
> > ' Deconnexion de la base
> > myReader.Close()
> > oOracleConn.Close()
> >
> >
>
>




Avatar
Julien
Et bien, c'est mon choix de départ car je travaille avec des terminaux
radios (wifi) et je leur envoi des écrans.
Si je veux afficher des listes déroulantes, je doit les contruires avec des
chaines de caractères (ex: "toto | tata | titi").
Evidement, les élements de la liste sont issus d'une base de données
(Oracle).

Pour gagner en terme performance, je stocke ces listes dans un dictionnaire
(DictionnaryBase) sous forme de tableau de chaines.

Ainsi, comme tu peux le voir dans mon code, j'ai besoin d'affecter
dynamiquement la taille des tableaux...

Merci pour ton aide. Julien



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
> Ya pas plus simple que ça ?
> Actuellement, je fais un redim de ma table à chaque boucle du Read() !
> Pas top niveau performances qd même !!

Le code n'est pas vraiment plus compliqué avec un DataAdapter et


évidemment
il y a d'autres options. Avant de me mettre inventer des méthodes, dit moi
pourquoi tu dois obtenir un tableau de String ? Ne pourrais-tu pas


travaillé
directement avec un datatable ?

--
Cordialement
Yanick
MVP pour Visual Basic

>
> Sinon, tu n'as pas un bout de code ?
>
> Merci bcp
>
>
> "Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
> news:%
> > Salut!
> >
> > un DataReader ne connait pas sa taille.. si tu veux cette information,
> > remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le
nombre
> > de ligne qu'il contient.
> >
> > --
> > Cordialement
> > Yanick
> > MVP pour Visual Basic
> >
> > "Julien" a écrit dans le message de
> > news:cr187h$e8j$
> > > L'objet OracleDataReader ne comporte pas de méthode .Count !
> > > Comment connaître le nb d'enregistrements renvoyés ?
> > >
> > > Merci à tous.
> > >
> > > Code en exemple :
> > >
> > > 'Créé la liste à ajouter
> > > Dim tabstr() As String
> > >
> > > ' Connexion à la base
> > > Dim oOracleConn As OracleConnection = New
> OracleConnection
> > >
> > > 'Récupération des variables globales
> > > oOracleConn.ConnectionString = "Data Source=" & Net8
> > > oOracleConn.ConnectionString += ";User Id=" & User
> > > oOracleConn.ConnectionString += ";Password=" & Mdp
> > > oOracleConn.ConnectionString += ";Integrated
> Security=no"
> > > oOracleConn.Open()
> > >
> > > ' Exécution de la requête et récupération du


résultat
> > > Dim myCommand As New OracleCommand(reqSQL,
oOracleConn)
> > > Dim i As Integer = 0
> > >
> > > Dim myReader As OracleDataReader > > > > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> > > 'TODO : trouver comment connaitre à l'avance le nb
> > > d'enregistrements renvoyés !!!
> > > -->> ReDim tabstr(myReader.COUNT)
> > > While myReader.Read()
> > > tabstr(i) = myReader.GetString(0)
> > > i += 1
> > > End While
> > >
> > > ' Deconnexion de la base
> > > myReader.Close()
> > > oOracleConn.Close()
> > >
> > >
> >
> >
>
>




Avatar
Zoury
D'accord, voici donc une méthode très simple.. on créer un buffer (espace
tampon) que l'on étire au besoin, j'vais employer un ArrayList au lieu d'un
array directement.

(non testé)
'***
Const BUFFER_SIZE As Int32 = 50

'Créé la liste à ajouter
Dim al As ArrayList

' Connexion à la base
Dim oOracleConn As OracleConnection = New OracleConnection

'Récupération des variables globales
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"
oOracleConn.Open()

' Exécution de la requête et récupération du résultat
Dim myCommand As New OracleCommand(reqSQL, oOracleConn)
Dim i As Integer = 0

Dim myReader As OracleDataReader myCommand.ExecuteReader(CommandBehavior.CloseConnection)

al = New ArrayList(BUFFER_SIZE)
While myReader.Read()
If (i > al.Count) Then
al.Capacity *= 2 ' on double la capacité
End If
al.Add(myReader.GetString(0))
i += 1
End While

' on tronque le surplus
al.TrimToSize()

' Deconnexion de la base
myReader.Close()
oOracleConn.Close()

' on renvoit un tableau de chaine
Return DirectCast(al.ToArray(GetType(String)), String())
'***

ça devrait être assez rapide.



et concernant ceci :
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"



la concaténation multiple n'est pas une bonne idée.. Les chaines ne sont pas
éditable en .NET. C'est à dire qu'à chaque fois que tu concatènes/modifies
une chaine, le système en fait une copie complète.

je te recommande un StringBuilder (si tu tiens à avoir ton code sur
plusieurs lignes) ou encore la méthode String.Format(), comme ceci :
'***
oOracleConn.ConnectionString = _
String.Format("Data Source={0};User Id={1};Password={2};Integrated
Security=no", Net8, User, Mdp)
'***

--
Cordialement
Yanick
MVP pour Visual Basic
"Julien" a écrit dans le message de
news:cr1e80$gof$
Et bien, c'est mon choix de départ car je travaille avec des terminaux
radios (wifi) et je leur envoi des écrans.
Si je veux afficher des listes déroulantes, je doit les contruires avec


des
chaines de caractères (ex: "toto | tata | titi").
Evidement, les élements de la liste sont issus d'une base de données
(Oracle).

Pour gagner en terme performance, je stocke ces listes dans un


dictionnaire
(DictionnaryBase) sous forme de tableau de chaines.

Ainsi, comme tu peux le voir dans mon code, j'ai besoin d'affecter
dynamiquement la taille des tableaux...

Merci pour ton aide. Julien



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
> > Ya pas plus simple que ça ?
> > Actuellement, je fais un redim de ma table à chaque boucle du Read() !
> > Pas top niveau performances qd même !!
>
> Le code n'est pas vraiment plus compliqué avec un DataAdapter et
évidemment
> il y a d'autres options. Avant de me mettre inventer des méthodes, dit


moi
> pourquoi tu dois obtenir un tableau de String ? Ne pourrais-tu pas
travaillé
> directement avec un datatable ?
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
> >
> > Sinon, tu n'as pas un bout de code ?
> >
> > Merci bcp
> >
> >
> > "Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message


de
> > news:%
> > > Salut!
> > >
> > > un DataReader ne connait pas sa taille.. si tu veux cette


information,
> > > remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le
> nombre
> > > de ligne qu'il contient.
> > >
> > > --
> > > Cordialement
> > > Yanick
> > > MVP pour Visual Basic
> > >
> > > "Julien" a écrit dans le message de
> > > news:cr187h$e8j$
> > > > L'objet OracleDataReader ne comporte pas de méthode .Count !
> > > > Comment connaître le nb d'enregistrements renvoyés ?
> > > >
> > > > Merci à tous.
> > > >
> > > > Code en exemple :
> > > >
> > > > 'Créé la liste à ajouter
> > > > Dim tabstr() As String
> > > >
> > > > ' Connexion à la base
> > > > Dim oOracleConn As OracleConnection = New
> > OracleConnection
> > > >
> > > > 'Récupération des variables globales
> > > > oOracleConn.ConnectionString = "Data Source=" &


Net8
> > > > oOracleConn.ConnectionString += ";User Id=" & User
> > > > oOracleConn.ConnectionString += ";Password=" & Mdp
> > > > oOracleConn.ConnectionString += ";Integrated
> > Security=no"
> > > > oOracleConn.Open()
> > > >
> > > > ' Exécution de la requête et récupération du
résultat
> > > > Dim myCommand As New OracleCommand(reqSQL,
> oOracleConn)
> > > > Dim i As Integer = 0
> > > >
> > > > Dim myReader As OracleDataReader > > > > > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> > > > 'TODO : trouver comment connaitre à l'avance le nb
> > > > d'enregistrements renvoyés !!!
> > > > -->> ReDim tabstr(myReader.COUNT)
> > > > While myReader.Read()
> > > > tabstr(i) = myReader.GetString(0)
> > > > i += 1
> > > > End While
> > > >
> > > > ' Deconnexion de la base
> > > > myReader.Close()
> > > > oOracleConn.Close()
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Julien
Merci beaucoup,

Je vais suivre ton conseil pour le ArrayList, je pense que c'est bien plus
performant que de faire un ReDim de mon tableau à chacun des passages de ma
boucle ;)

De plus (question bête) le fait de faire un if dans chaque boucle ne
prend-t-il pas trop de ressources ?

J'utiliserai aussi le stringBuilder !

Merci bcp pour tous ces bons conseils !

Julien



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
D'accord, voici donc une méthode très simple.. on créer un buffer (espace
tampon) que l'on étire au besoin, j'vais employer un ArrayList au lieu
d'un
array directement.

(non testé)
'***
Const BUFFER_SIZE As Int32 = 50

'Créé la liste à ajouter
Dim al As ArrayList

' Connexion à la base
Dim oOracleConn As OracleConnection = New OracleConnection

'Récupération des variables globales
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"
oOracleConn.Open()

' Exécution de la requête et récupération du résultat
Dim myCommand As New OracleCommand(reqSQL, oOracleConn)
Dim i As Integer = 0

Dim myReader As OracleDataReader > myCommand.ExecuteReader(CommandBehavior.CloseConnection)

al = New ArrayList(BUFFER_SIZE)
While myReader.Read()
If (i > al.Count) Then
al.Capacity *= 2 ' on double la capacité
End If
al.Add(myReader.GetString(0))
i += 1
End While

' on tronque le surplus
al.TrimToSize()

' Deconnexion de la base
myReader.Close()
oOracleConn.Close()

' on renvoit un tableau de chaine
Return DirectCast(al.ToArray(GetType(String)), String())
'***

ça devrait être assez rapide.



et concernant ceci :
oOracleConn.ConnectionString = "Data Source=" & Net8
oOracleConn.ConnectionString += ";User Id=" & User
oOracleConn.ConnectionString += ";Password=" & Mdp
oOracleConn.ConnectionString += ";Integrated Security=no"



la concaténation multiple n'est pas une bonne idée.. Les chaines ne sont
pas
éditable en .NET. C'est à dire qu'à chaque fois que tu concatènes/modifies
une chaine, le système en fait une copie complète.

je te recommande un StringBuilder (si tu tiens à avoir ton code sur
plusieurs lignes) ou encore la méthode String.Format(), comme ceci :
'***
oOracleConn.ConnectionString = _
String.Format("Data Source={0};User Id={1};Password={2};Integrated
Security=no", Net8, User, Mdp)
'***

--
Cordialement
Yanick
MVP pour Visual Basic
"Julien" a écrit dans le message de
news:cr1e80$gof$
Et bien, c'est mon choix de départ car je travaille avec des terminaux
radios (wifi) et je leur envoi des écrans.
Si je veux afficher des listes déroulantes, je doit les contruires avec


des
chaines de caractères (ex: "toto | tata | titi").
Evidement, les élements de la liste sont issus d'une base de données
(Oracle).

Pour gagner en terme performance, je stocke ces listes dans un


dictionnaire
(DictionnaryBase) sous forme de tableau de chaines.

Ainsi, comme tu peux le voir dans mon code, j'ai besoin d'affecter
dynamiquement la taille des tableaux...

Merci pour ton aide. Julien



"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
> > Ya pas plus simple que ça ?
> > Actuellement, je fais un redim de ma table à chaque boucle du Read()
> > !
> > Pas top niveau performances qd même !!
>
> Le code n'est pas vraiment plus compliqué avec un DataAdapter et
évidemment
> il y a d'autres options. Avant de me mettre inventer des méthodes, dit


moi
> pourquoi tu dois obtenir un tableau de String ? Ne pourrais-tu pas
travaillé
> directement avec un datatable ?
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
> >
> > Sinon, tu n'as pas un bout de code ?
> >
> > Merci bcp
> >
> >
> > "Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message


de
> > news:%
> > > Salut!
> > >
> > > un DataReader ne connait pas sa taille.. si tu veux cette


information,
> > > remplit plutôt un DataTable à l'aide d'un DataAdapter et regarde le
> nombre
> > > de ligne qu'il contient.
> > >
> > > --
> > > Cordialement
> > > Yanick
> > > MVP pour Visual Basic
> > >
> > > "Julien" a écrit dans le message de
> > > news:cr187h$e8j$
> > > > L'objet OracleDataReader ne comporte pas de méthode .Count !
> > > > Comment connaître le nb d'enregistrements renvoyés ?
> > > >
> > > > Merci à tous.
> > > >
> > > > Code en exemple :
> > > >
> > > > 'Créé la liste à ajouter
> > > > Dim tabstr() As String
> > > >
> > > > ' Connexion à la base
> > > > Dim oOracleConn As OracleConnection = New
> > OracleConnection
> > > >
> > > > 'Récupération des variables globales
> > > > oOracleConn.ConnectionString = "Data Source=" &


Net8
> > > > oOracleConn.ConnectionString += ";User Id=" &
> > > > User
> > > > oOracleConn.ConnectionString += ";Password=" &
> > > > Mdp
> > > > oOracleConn.ConnectionString += ";Integrated
> > Security=no"
> > > > oOracleConn.Open()
> > > >
> > > > ' Exécution de la requête et récupération du
résultat
> > > > Dim myCommand As New OracleCommand(reqSQL,
> oOracleConn)
> > > > Dim i As Integer = 0
> > > >
> > > > Dim myReader As OracleDataReader >> > > > > myCommand.ExecuteReader(CommandBehavior.CloseConnection)
> > > > 'TODO : trouver comment connaitre à l'avance le
> > > > nb
> > > > d'enregistrements renvoyés !!!
> > > > -->> ReDim tabstr(myReader.COUNT)
> > > > While myReader.Read()
> > > > tabstr(i) = myReader.GetString(0)
> > > > i += 1
> > > > End While
> > > >
> > > > ' Deconnexion de la base
> > > > myReader.Close()
> > > > oOracleConn.Close()
> > > >
> > > >
> > >
> > >
> >
> >
>
>








Avatar
Zoury
> De plus (question bête) le fait de faire un if dans chaque boucle ne
prend-t-il pas trop de ressources ?



si peu, si peu.. ;O)
et beaucoup moins que ReDim(UBound() + 1) à chaque boucle..


J'utiliserai aussi le stringBuilder !



Good!


Merci bcp pour tous ces bons conseils !



fait plaisir! et bonne année!! ;O)


--
Cordialement
Yanick
MVP pour Visual Basic