Mon code est trop lent !

alexbesn Messages postés 21 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 4 août 2009 - 6 mai 2009 à 15:12
alexbesn Messages postés 21 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 4 août 2009 - 12 mai 2009 à 09:18
Bonjour à tous.

J'ai écris du code mais il est beaucoup trop lent, j'aurai besoin de l'avis d'experts !

Je souhaiterai écrire un programme qui vérifie chaque entrée d'une vieile base de données (sous access). Cette base de données contient une correspondance @mac / noport pour chaque switch d'une entreprise. J'ai écris du code qui me récupère les informations à jour (via telnet) et me retourne ces informations sous forme d'un tableau de 4 colonnes (vlan, @mac, noport, nomduswitch) et qui fait en général 500 à 800 lignes pour un switch. Il y a une trentaine de switch dans l'entreprise.

Pour cela, j'ai pensé à faire ainsi :
1) Connexion telnet au switch et récupération de la configuration sous forme d'un tableau (~600 lignes)
2) Recopie de ce tableau dans une table
3) On recommence pour tous les autres switchs
4) Requete SQL pour chaque ligne de la vieile table qui vérifie dans la nouvelle table que les informations sont correctes

J'en suis à l'étape 2 et le code que j'ai écris est très lent !! En effet, il faut 1 minute pour recopier un tableau de 800 lignes dans une table !

Je vous met le code pour que vous jetiez un oeil, j'espère que des malins pour m'aguiller !

//On prend toute la table
SqlSearch = "select * from " + listBox_tables.SelectedItem;

//Déclaration du data adapteur
OleDbDataAdapter DtaGrid = new OleDbDataAdapter(SqlSearch, Conn);

//Selection ou ajout de la ligne
DtrGrid = DtsGrid.Tables[Convert.ToString(listBox_tables.SelectedItem)].NewRow();

//On parcourt les valeurs
for (int i = 0; i < DttGrid.Columns.Count; i++)
{
DtrGrid[i] = TabTxtbox[i].Text;
}

//Ajout de la ligne à la table
DtsGrid.Tables[Convert.ToString(listBox_tables.SelectedItem)].Rows.Add(DtrGrid);

//On maj la base
CmdGrid = new OleDbCommandBuilder(DtaGrid);
DtaGrid.UpdateCommand = CmdGrid.GetUpdateCommand();
DtaGrid.Update(DtsGrid, Convert.ToString(listBox_tables.SelectedItem));

5 réponses

alexbesn Messages postés 21 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 4 août 2009
6 mai 2009 à 15:16
Désolé je ne sais pas pourquoi la présentation n'est pas passée :s
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
6 mai 2009 à 16:32
Pour accelérer le traitement (l'ajout de donnée), il faut que tu crées une transaction sur la base dans laquelle tu écris.

Sébastien FERRAND (blog)
Consultant Sénior
[Microsoft Visual C# MVP]
0
alexbesn Messages postés 21 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 4 août 2009
7 mai 2009 à 09:08
D'accord, mais je suis déjà pas très à l'aise avec Access, alors si tu pouvais m'aiguiller ...
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
8 mai 2009 à 19:18
Bonjour,

j'ai l'impression que tu mets la base à jour à chaque lignes, as-tu essayé de la mettre à jour à la fin du remplissage du dataset, en une seule fois ?

Cela dit, les composants Datadadapter, datagrid et autre dataset, s'ils offrent un haut niveau fonctionel, sont notoirement lents concerant la mise à jour des données.
As-tu penser à generer une grosse requette "insert" à la main?
ou de generer un fichier qui serait importé par un BULK copy ou un BCP?

C# is amazing, enjoy it!
0

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

Posez votre question
alexbesn Messages postés 21 Date d'inscription jeudi 23 avril 2009 Statut Membre Dernière intervention 4 août 2009
12 mai 2009 à 09:18
J'ai trouvé la solution.

Il suffit de vider le cache à chaque itération (dts.Clear()) et cela ne prend plus que 6 secondes pour remplir la table.
0
Rejoignez-nous