Exécution ne finie pas...

woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007 - 5 juil. 2006 à 12:01
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007 - 6 juil. 2006 à 17:05
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

bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
5 juil. 2006 à 12:13
 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
0
gcorbineau Messages postés 143 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 octobre 2006
5 juil. 2006 à 13:23
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)
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 14:07
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
0
bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
5 juil. 2006 à 14:13
    "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 ...
0

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

Posez votre question
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 14:21
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
0
bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
5 juil. 2006 à 14:25
    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
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 14:28
D'accord je vais voir ça, mais bon il faut d'abord que je me documente, je n'ai jamais utilisé les threads...

_________________________________________________________________________
Woot
0
gcorbineau Messages postés 143 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 25 octobre 2006
5 juil. 2006 à 15:55
Désoler je n'avait pas vue. :-(
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 15:56
Pas de soucis ;)

_________________________________________________________________________
Woot
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
5 juil. 2006 à 17:14
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.
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 17:19
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
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
5 juil. 2006 à 17:30
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.
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 17:43
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
0
bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
5 juil. 2006 à 17:51
    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 ...

++
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
5 juil. 2006 à 17:54
Ok je vais essayer de mettre ta solution en place.
Merci pour cette infos précieuse.
Je vous tiens au courant.

_________________________________________________________________________
Woot
0
bernie666 Messages postés 427 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 29 janvier 2008 1
5 juil. 2006 à 17:56
    ok ok ;)

no soucy

++
0
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
5 juil. 2006 à 20:00
sinon essaye de tracer ce que fait ton prog, dans un fichier...
tu verras s'il tourne, ou où il bloque...
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
6 juil. 2006 à 14:09
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 juil. 2006 à 14:55
Euh non y'a pas besoin qu'elles soient statiques...

<hr size= "2" /> VC# forever
=13319
0
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
6 juil. 2006 à 15:03
Ok d'accord...
Bon ben il est bizarre alors mon code lol
Là je suis trop paumé...

_________________________________________________________________________
Woot
0
Rejoignez-nous