Rapidité pour réponse à requète SQL via ADO .net

Résolu
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010 - 8 déc. 2004 à 20:35
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 - 17 déc. 2004 à 15:09
Bonjour à tous,

j'ai une petite question sur la rapidité des réponses sur requète ADO.

Je fais une petite applie (sous XP) en VB.net avec un serveur SQL(MS SQL Server) en locale sur la machine.

Ma question est la suivante, vaut-il mieux (sur une table de 1500 enregistrements) :

1) faire 1 requtête (SELECT FROM NomTable Where Colonne = Valeur avec Valeur en clée primaire) qui retourne une seule ligne à traitée. Faire ceci 16 fois (donc 16 connexions, 16 Dataset à remplir...).

OU

2) faire une requête (SELECT * FROM NomTable) qui retourne toute la table et faire mon traitement en VB (donc une seule connexion, mais un gros rapatriement de la table).

??????????

Le fond de ma question est le suivant : comment faire pour avoir la méthode la plus rapide pour la gestion des réponses à mes requête.

--------------------------------------------------
Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.

19 réponses

cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
8 déc. 2004 à 22:47
labout

Voilà comment je ferai

dsProducts as new DataSet
dim strConnection As String = "Server=localhost;" & _
"DataBase=Northwind;" & _
"Integrated Security=SSPI"

Dim northwindConnection As New SqlConnection(strConnection)

' Le SqlDataAdapter est utilisé pour remplir le DataSet
Dim ProductAdapter As New SqlDataAdapter( _
"SELECT ProductName,Price FROM products",northwindConnection)
ProductAdapter.Fill(dsProducts, PRODUCT_TABLE_NAME)
ProductAdapter.Fill(dsProducts,"Products")

dvProducts = new dataView(dsProducts.Tables("products"),_
"ProductName like '%'",= "ProductName ASC", _
DataViewRowState.OriginalRows)

ensuite si filtre sur "A"

dim strfilter as string
strFilter = "ProductName like A%"
dvProducts.RowFilter=strFilter

ensuite

For i = 0 To dvProducts.Count ' le nb de records
' le premier champ de la ligne i
MsgBox(dvProducts.Item(i).Item(0))
' le deuxième champ de la ligne i
MsgBox(dvProducts.Item(i).Item(1))
' le nom du premier champ
MsgBox(dvProducts.Item(i).DataView.Table.Columns(0).ToString)
' le type du champ
msgbox dvProducts.Item(i).DataView.Table.Columns(0).datatype.name
Next

@+
3
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
8 déc. 2004 à 21:43
labout

Je pencherai sans hésiter pour la deuxième solution surtout si la tqble ne fait que 1500 enreg.

Dans la première solution il y aura 16 dateset mais sur la même connection.
@+
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
8 déc. 2004 à 21:51
Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
8 déc. 2004 à 21:52
Merci labout,

mais je ne peux pas faire de requête alors,
moi il faut que je mette à jour une ligne bien précise.
Je doit faire un "SELECT" sur un dataset, c'est possible ?

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
8 déc. 2004 à 22:36
labout,

je crois que g trouvé encore mieux.
Faire une requète pour rapatrier dans un dataset les 16 lignes qui m'interressent.
Faire mes traitement dans le dataset, puis remetrre à jour dans la bd.

ça en vaut vraiment, le coup car ça va me faire modifier sacrément mon code :(

si tu as des idées, n'hésite pas.

PS : j'avais déjà fait des recherche sur sql et j'avais déjà remarque que tu répondais souvent. Quelle surprise quand j'ai vu que tu me répondais ;)
Au nom de tous, merci pour le partage de la connaissance ;)

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
8 déc. 2004 à 22:49
labout

Je réponds en ce moment car je suis en attente d'une mission
venant d'en terminer une.
@+
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
9 déc. 2004 à 09:06
labout,

merci pour ta réponse si rapide, je vais étudier ça aujourd'hui.
Je te tient au courant.

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
9 déc. 2004 à 12:22
Bonne nouvelle !

j'ai trouvé une methode relativement simple sur un système de requête.

Avec la méthode Select() d'un datatable je peux sélectionner la ligne qui m'interresse et y mettre à jour la cellule de mon choix.

C'est hypra rapide !

Cette soluce est inspirée de ton explication, merci pour ton aide labout !!

Sans doute à bientôt mon projet n'est pas fini ;)

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 12:37
Labout,

j'ai encore une petite question :

comment fais-tu la mise à jour de ta base de données avec ton dataview ?

Je suis coincé.

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
17 déc. 2004 à 13:11
labout

Pour datagrid avec maj, je passe par un oleadapter que je dépose dans ma feuille
il me crée les comamndes

OleDbDataAdapter1.Update(dsproduct, "matable")
@+
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 13:29
lol

merci pour ta réponse si rapide, c'est exactement ce que je viens de trouver ;)

Merci pour ton aide !

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 14:06
Heu..... encore une tite question ;)

Je veux utiliser l'aggrégat Max avec RowFilter pour trouver la valeur maximale d'une colonne.

tu sais quelle est la syntaxe ?

J'ai essayé ....RowFilter("Max(nom_colonne)") mais ça ne marche pas :)

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
17 déc. 2004 à 14:21
labout

c'est dans l'alimentation de la grille
qu'il faut mettre le filtre dans la requete

SELECT max(Price) FROM products
ou
SELECT max(UnitPrice) FROM products group by ProductName,unitprice order by UnitPrice desc

puis réalimenter la grille
@+
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 14:31
Mais avec cette méthode, je suis obligé d'alimenter à nouveu un dataset.

Avec RowFilter, je dois normalement pouvoir utiliser Max, mais g toujours une erreur, je n'arrive pas à trouver la synthaxe.

Par exemple, pour chercher la ligne dont la colonne "MaColonne" est égale à "1", je fais :

dvProducts.RowFilter="ProductName = '1'"

et pour avoir la valeur max de cette même colonne je voudrais un truc du tyle :

dvProducts.RowFilter="Max(ProductName )"

mais la synthaxe n'est pas bonne :(

C'est ou que ça cloche ?

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 14:41
J'ai trouvé la synthaxe :

dvProducts.RowFilter="ProductName = Max(ProductName)"

par contre je suis déçu car le temps de réponse est carrément long ! (2 secondes pour 2500 enregistrement).

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
17 déc. 2004 à 14:52
labout

mets donc une cle d'index sur le champ clé et tu verras la différence de 1 à 100
mais je ne comprends pas max(productname) c'ela donne le produit dont le nom est le plus long ???

@+
0
Vexplore Messages postés 25 Date d'inscription lundi 22 décembre 2003 Statut Membre Dernière intervention 8 octobre 2010
17 déc. 2004 à 14:55
Euh.... comment on fait pour mettre un index sur le dataview ?

Le Max me donne la valeur la plus grande de la colonne productname

Merci de partager le savoir.
Il n'y a pas de vol, juste de l'échange.
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
17 déc. 2004 à 15:07
labout

Non pas dans le dataview

Dans SqlServer
Ouvre la table en modification
clic droit Index puis Nouveu enfin sélectionner le champ.
fermer et enregistrer
J'ai vérifié 2700 enreg 15 secondes

Dans Access c'est un peu la même chose
@+
0
cs_labout Messages postés 1356 Date d'inscription samedi 8 décembre 2001 Statut Membre Dernière intervention 23 octobre 2006 8
17 déc. 2004 à 15:09
labout
4928 enreg 11 secondes
@+
0
Rejoignez-nous