Mon code est trop lent !

Signaler
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009
-
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009
-
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

Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009

Désolé je ne sais pas pourquoi la présentation n'est pas passée :s
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
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]
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009

D'accord, mais je suis déjà pas très à l'aise avec Access, alors si tu pouvais m'aiguiller ...
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
30
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!
Messages postés
21
Date d'inscription
jeudi 23 avril 2009
Statut
Membre
Dernière intervention
4 août 2009

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.