Exécution ne finie pas...

Signaler
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007
-
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007
-
Salut à tous,
Voilà, dans mon programme, je dois travaillé sur une table access qui comporte environ 16 000 entrées!
Et lorsque je fais mes test de chaque fonction avec un 'limiteur' qui ne traite donc qu'une centaine de champs, l'éxécution ce passe bien.
Mais lorsque je fais le traitement sur toute la table, l'éxécution ne termine pas même si l'on ne teste qu'une fonction!
Par exemple, cette fonction est en éxécution depuis 30min! :

public
void NettoyeTitre(){InitialiserCorrespondances();

string chaine;
string lineCmd "UPDATE M9004_CONTACTSYNC SET TITLE '{0}' WHERE CONTACTSYNCID = {1}";

string req =
"SELECT TITLE ,CONTACTSYNCID FROM M9004_CONTACTSYNC";ADODB.

Recordset Recordset =
new ADODB.
Recordset();Recordset.Open(req, chaineDeConnection2, ADODB.

CursorTypeEnum.adOpenKeyset, ADODB.
LockTypeEnum.adLockOptimistic, -1);

Collection<
string> exclusC = GetExclusCommunes;

if (Recordset.RecordCount > 0){Recordset.MoveFirst();

while (!(Recordset.EOF)){chaine =

"";ADODB.

Field field = Recordset.Fields[
"TITLE"];

if (field.Value !=
DBNull.Value){

if (
Convert.ToString(Recordset.Fields[
"TITLE"]).Length > 0){chaine = Recordset.Fields[

"TITLE"].Value.ToString();chaine = (CleanEspaces(chaine)).Trim();

chaine = Cleanup((Recordset.Fields[

"TITLE"].Value).ToString(), limite_autres);chaine = EpurerNom(chaine, exclusC);

}

}

lineCmd =

String.Format(lineCmd, chaine.Trim(), Recordset.Fields[
"CONTACTSYNCID"].Value);

OdbcCommand cmd =
new
OdbcCommand(lineCmd, connection2);cmd.ExecuteNonQuery();

Recordset.MoveNext();

}

}

MessageBox.Show(
"Fonction NettoyeTitre() terminée.");Recordset.Close();

}

Je voudrais donc savoir si le problème viens de mon code ou si c'est simplement la table qui est trop grande.
Merci

_________________________________________________________________________
Woot

29 réponses

Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
 Si ton pc est un 486Dx2 ... sa peut poser quelques soucy ... mais 16 000 entrées normalement il de devrai pas y avoir de probleme ... si le traitement de ta fonction est lourd => tu peux développer un process a coté qui te cleanra tes titres en asynchrone (ou au moins utiliser les threads) comme ca ton application ne seras pas bloquée
Messages postés
143
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 octobre 2006

Juste un petit truc je n' ai pas vu dans ta boucle:

Recordset.MoveFirst();

while (!(Recordset.EOF)){

.....
}

Une fonction permettant d'avancer à l'enregistrement (Recordset.MoveNext ou Recordset.Next)
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

435183

gcorbineau
 -> Il y a un Recordset.MoveNext, c'est la dernière ligne de la fonction;) juste après l'éxécution de la commande odbc.

bernie666 -> Je ne comprend pas trop ce que tu veu dire...

Mais en faite, ce que je ne comprend pas c'est que lorsque j'effectue un debugg, ça fonctionne très bien!
De même, lorsque l'on limite le nombre d'entrées à traiter.

De plus, il y a autre chose que je ne comprend pas, lorsque je click sur mon bouton démarrer, je copie la base d'origine pour la mettre dans un autre répertoire, histoire de ne pas détruire ma base.
Mais le faite est que dès que j'éxécute une fonction, la base est mal copier, exemple :
1ere exemple, lorsque la base est bien copier :

private
void cmdDemarrer_Click(
object sender,
EventArgs e){

File.Copy(
"C:\\Documents and Settings\\Administrateur\\Mes documents\\Wouter Tjon Stage\\Contacts.mdb",
"C:\\Documents and Settings\\Administrateur\\Mes documents\\Wouter Tjon Stage\\ProjetrecoupementContacts\\Contacts.mdb",
true);

//Affectation de la chaine de connection à la connection à la base :connection2.ConnectionString = chaineDeConnection2;

// On mets le timeout au minimun (pour éviter d'attendre X secondes si erreur) :connection2.ConnectionTimeout = 1;

try{

//Ouverture de la connection à la seconde base :connection2.Open();

}

catch (
OdbcException exception){

MessageBox.Show(exception.ToString());

return;}

MessageBox.Show(
"Normalement ça a copier la table...",
"Table copier?");

//NettoyeAdresse();}

Et là, lorsque j'éxécute 'NettoyeAdresse(), il me vide ma table mais me laisse le nom des champs! :

private
void cmdDemarrer_Click(
object sender,
EventArgs e){

File.Copy(
"C:\\Documents and Settings\\Administrateur\\Mes documents\\Wouter Tjon Stage\\Contacts.mdb",
"C:\\Documents and Settings\\Administrateur\\Mes documents\\Wouter Tjon Stage\\ProjetrecoupementContacts\\Contacts.mdb",
true);

//Affectation de la chaine de connection à la connection à la seconde base :connection2.ConnectionString = chaineDeConnection2;

// On mets le timeout au minimun (pour éviter d'attendre X secondes si erreur) :connection2.ConnectionTimeout = 1;

try{

//Ouverture de la connection à la seconde base :connection2.Open();

}

catch (
OdbcException exception){

MessageBox.Show(exception.ToString());

return;}

MessageBox.Show(
"Normalement ça a copier la table...",
"Table copier?");

NettoyeAdresse();}

Voilà tout mes problèmes...
En éspérant les résoudres grâce à votre aide.

_________________________________________________________________________
Woot
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
    "Et là, lorsque j'éxécute 'NettoyeAdresse(), il me vide ma table mais me laisse le nom des champs! :" <= tu veux faire quoi exactement ? vider la table ET le nom des champs ? si oui => DROP TABLE ...
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Non en faite je souhaite enlever des espaces, les accents, mettre en majuscule, supprimer les caractères spéciaux...
En gros ôter tous ce qui est inutile mais garder une lisibilité de la table, donc faire une éspèce de 'compression'.
Donc je souhaite garder tous mes champs, toutes mes colonnes mais justement, le problème est que quand j'éxécute une fonction pour nettoyer un champs, il me supprime toutes les entrées de la table! (ce que je ne souhaite donc pas!)
En faite j'ai l'impression qu'il me copie mal la table, mais ce n'est pas le cas vu que quand je n'éxécute pas de fonction, il le fait très bien.
Donc le problème doit ce situer dans une optimisation du code mais je ne sais pas ou, d'où mon topic!
Si quelqu'un a une idée...

_________________________________________________________________________
Woot
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
    Oui ton probleme de base comme tu me l'as dit est un probleme de temps d'execution de ta fonction ... => pour ne pas bloquer ton application => utilise des Threads
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

D'accord je vais voir ça, mais bon il faut d'abord que je me documente, je n'ai jamais utilisé les threads...

_________________________________________________________________________
Woot
Messages postés
143
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 octobre 2006

Désoler je n'avait pas vue. :-(
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Pas de soucis ;)

_________________________________________________________________________
Woot
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
Vraiment bizarre ton pb, on réalité j'ai eu le meme genre de pb mais pas avec une BDD.

Le thread permettra de ne pas bloquer ton appli, mais pas de résoudre ton pb.

En debug, ton programme rame, donc access a un peu plus de temps pour faire ses update (ou autre). Et peut-etre qu'en exécution normal, access s'en prend plein la tête et plante quand il y a trop de records.

Ca fait un moment que je n'ai pas fait de BDD pour mieux te renseigner. Il faudrait peut-etre tester avec SQL Server Express pour voir si c'est ton programme qui fait planté ou si c'est access qui n'en peut plus. Mais bon faut avoir SQL sous la main et un peu le connaitre.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Et bien enfaite, comme dis auparavant, quand j'éxécute (et non debugg) avec peu d'entrées sélectionner, ça marche.
Mais quand j'éxécute avec toutes les entrées de la base, ça ne marche pas du tout, de plus, ça me supprime les entées de ma table!
Ce n'est donc pas qu'en debugg que c'est lent, mais aussi en éxécution!

_________________________________________________________________________
Woot
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
Tu dit dans ton 1er message que ca tournait depuis 30min en release et c'était pas fini. Et
quand tu lances ton programme avec Visual en debug, ca met combien de
temps ?
En gros as-tu fait des tests de temps avec/sans Visual et release/debug.



N'oublie pas de créer le thread (fonction NettoyeTitre), c'est plus propre.



PS : Je pars dans l'hypothèse (peut-etre mauvaise) que c'est Access qui
merde, mais là faudrait qu'un spécialiste Access te réponde.
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

En faite ça faisait 30 min que ça tournait en éxécution mais je l'ai laisser tourner 2h et la fonction n'était toujours pas terminée! (que ce soit en debugg ou non, mais au bout de 2h, j'ai coupé)

Pour le thread, je n'aurais pas le temps de le mettre en place en vue du temps qui me reste et puis, il faudrait que je me documente car c'est la première fois que je code en c#!
Donc voilà, le thread c'est foutue pour moi...

Pour ton hypothèse, je ne pense pas que access merde, enfin rien d'apparent en tout cas.
Donc je vais faire un appel solanel (ça s'écrit comme ça?) :
Y-a-t'il un spécialiste access par ici?
Merci

P.S.: Pour la suppression des entrées de la table, je pense que c'est moi qui ait foirer dans une requête DELETE! Mais ce n'est pas sûr je suis encore en train de tester.

_________________________________________________________________________
Woot
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
    L'utilisation d'un thread va te prendre 1 min 30 :)

Using System.Threading;

            Thread myThread = new Thread(new ThreadStart(myFunction));

            myThread.Start();

public void myFunction(){
    //code qui va etre executer à l'interieur du thread
}

//Sinon qd sa tourn comme ca pdt 2 h ... met des points d'arretzs tous les 1000 traitements ... sa pourra peut etre t'aider ...

++
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Ok je vais essayer de mettre ta solution en place.
Merci pour cette infos précieuse.
Je vous tiens au courant.

_________________________________________________________________________
Woot
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
    ok ok ;)

no soucy

++
Messages postés
154
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
22 août 2007

sinon essaye de tracer ce que fait ton prog, dans un fichier...
tu verras s'il tourne, ou où il bloque...
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Mais pour utiliser un thread, il faut que toutes les fonctions soit statiques?
Car il me dit que mes fonctions ne sont pas statiques ce qui me génère des erreurs...

_________________________________________________________________________
Woot
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Euh non y'a pas besoin qu'elles soient statiques...

<hr size= "2" /> VC# forever
=13319
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Ok d'accord...
Bon ben il est bizarre alors mon code lol
Là je suis trop paumé...

_________________________________________________________________________
Woot