J'ai fais une recherche mais n'ai pas trouvé de réponse à cet épineux sujet...
J'ai récupéré sur le net une classe Oracle pour interroger la base de donnée au bureau.
Je suis un peu choqué sur la manière de récupérer les résultats du OracleDataReader. Il ne semble exister aucun moyen de récupérer le nombre de résultats à la requête Select (par exemple pour afficher une barre de progression pour la récupération des données sur des jeux de données volumineux) ?
La classe que j'ai trouvé effectue ceci :
Deux choses donc :
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 public Object[,] getQueryResult(string sQuery) { this.oracleCmd = new OracleCommand(sQuery, this.oracleCnx); this.oracleReader = null; this.oracleReader = this.oracleCmd.ExecuteReader(); Object[,] oArrResult; this.iNbRows = 0; this.iNbCols = this.oracleReader.FieldCount; // Initialisation du tableau de retour int a = this.oracleReader.RecordsAffected; while (this.oracleReader.Read()) { this.iNbRows++; } oArrResult = new Object[this.iNbRows, iNbCols]; // Remplissage du tableau de retour try { this.oracleReader = this.oracleCmd.ExecuteReader(); int i = 0; while (this.oracleReader.Read()) { for (int j = 0; j < this.iNbCols; j++) { oArrResult[i, j] = oracleReader.GetOracleValue(j); } i++; } } ... }
- on parcourt une première fois les résultats pour obtenir simplement le nombre de résultats (this.iNbRows++
- on effectue deux fois la requête (this.oracleCmd.ExecuteReader()
(et dernier point sensible -mais je crois que je ferais un autre post pour avoir votre avis- on utilise la fonction GetOracleValue qui a des perfs bien moindre que les autres accesseurs déjà typés Oracle, la question serait alors de savoir de quel type de donnée est le champ (j) dans mon code afin d'appeller le bon accesseur...)
Les deux questions qui résultent de mon post :
- Existe t'il un autre moyen d'avoir le nombre de résultats retournés par un SELECT (ex : par un Enumerator, je connais très mal les enumerators)
- Y'a t'il un cache .Net des requêtes effectuées ou la requête est-elle réellement exécutée deux fois sur le serveur Oracle ???
Partager