Tester connection ADO

Signaler
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
 Utilisateur anonyme -
Bonjour,


Pour tester la connection, notamment lors de la première utilisation, sur l'évènement BeforeConnect de mon ADOConnection, j'ai écrit ce code.
Ce que je ne comprends pas c'est que si la base n'est pas trouvée la proc boucle entre  path:=ExtractFilePath(Application.EXEName) et ADOConnection1.Connected:=true sans écrire dans le fichier ini. J'ai oublié quoi?

Je vous soumet ma proc avec quelques commentaires

//================================================
procedure TDM.ADOConnection1BeforeConnect(Sender: TObject);
begin
    path:=ExtractFilePath(Application.EXEName);
    FichierIni :=TIniFile.Create(path+'CDJ.ini');
    BaseEnCours:=FichierIni.ReadString('DataBase','DataSource','nonbd');
    if FileExists(BaseEnCours) then
      begin
      //ADOConnection1.Connected:=false;
      ADOConnection1.ConnectionString :=
      'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +BaseEnCours
      +';Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'
      +'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;'
      +'Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
      +'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
      +'Jet OLEDB:Don''t Copy Locale on Compact=False;'
      +'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
      ADOConnection1.Connected:=true;
      exit;
      end
    else
      ShowMessage('Impossible de trouver le fichier de données.' + chr(10) + chr(13)+'Il a peut-être été déplacé ou renommé.'+chr(10)+chr(13)+'Indiquez l''emplacement de ce fichier');
      with TOpenDialog.Create(Application) do
        begin
        Title := 'Ou se trouve le fichier de données?';
        Filter := 'Fichier CDJ (*.mdb)|*.mdb';
        if Execute then
          if FileExists(FileName) then
            begin
            ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ Filename + ';Persist Security Info=False';
            ADOConnection1.LoginPrompt := false;
            ADOConnection1.Connected:=true;
 ===> ici il boucle au début de procédure sans ecrire dans le fichier ini
            //Ecrire dans le fichier ini
            FichierIni.WriteString('DataBase','DataSource',FileName);
            end
        else
          begin
          ShowMessage('Erreur!  Aucun fichier de sélectionné.');
          ADOConnection1.Connected:=false;
          Application.Terminate;
         Ici quand je clique sur le bouton annuler de la boite 'Ouvrir fichier'  L'application ne se termine pas !!!!! On retrouve la boucle précédente.
          end;
        end;
    end;

D'avance merci

Codial

11 réponses


Salut,

Quand on lit ton code on n'y comprend rien car il est mal indenté.

Ensuite vu la taille de la procedure tu devrais créer d'autres procédures que tu appelles dans cette dernière.

Ensuite de nombreuses erreurs:

*
if FileExists(BaseEnCours) then
begin
//ADOConnection1.Connected:=false; //NE SERT A RIEN
ADOConnection1.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' +BaseEnCours
+';Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'
+'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;'
+'Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'
+'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'
+'Jet OLEDB:Don''t Copy Locale on Compact=False;'
+'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
// TOUT TON TRUC LA EST INDIGEST ;).
ADOConnection1.Connected:=true;
exit; // POURQUOI ?? TU UTILISES APRES ELSE DONC LE RESTE N'EST PAS EXCUTE
//C'EST DONC UNIIILE
end

*ShowMessage('Impossible de trouver le fichier de données.' + chr(10) + chr(13)+'Il a peut-être été déplacé ou renommé.'+chr(10)+chr(13)+'Indiquez l''emplacement de ce fichier');

Heu il manque pas un End; ou un begin ?????

*if FileExists(FileName) then

Ca arrive souvent qu'un TOpenDialog t'ouvre un fichier qui existe pas ??

*===> ici il boucle au début de procédure sans ecrire dans le fichier ini

Il boucle ?? a mon avis tu fais erreur. Une boucle fait intevernir while, repeat ou for. tu n'as rien de cela ici tu dois faire erreur.

*begin
ShowMessage('Erreur! Aucun fichier de sélectionné.');
ADOConnection1.Connected:=false;
Application.Terminate;
Ici quand je clique sur le bouton annuler de la boite 'Ouvrir fichier' L'application ne se termine pas !!!!! On retrouve la boucle précédente.
end;

Normal : le fait que le fichier n'existe pas est différent de cliquer sur Annuler dans ton TOpenDialog


Pour conclure deux conseils :
*avant de te lancer dans une telle application : apprend les bases. Vu le nombre d'erreur tu ne maitrises pas le béaba.
*Structure ton code et indexe le correctement : là c'est illisible. Bonjour la maintenance

@+
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonsoir,

Merci de tes conseils et j'en prend bonne note, car effectivement ce code, tel que présenté ici, n'est pas parfait je le reconnais. Ceci dit, apparemment il n'y a pas grand monde qui connait la réponse à mon problème, alors je cherche en bidouillant le code!!!

De plus je viens d'en découvrir un autre, comment fait on pour faire tourner une appli Delphi + Access sur un poste qui n'a pas Access?

Cordialement

Codial

Codial :

*Une question par message : de plus cette question a déja été posée.
*Merci de cliquer sur le bouton valider
*Ce n'est pas que l'on a pas de réponse c'est que ton code est incompréhensible et qu'en plus il manque des éléments comme la partie fichier ini.

*J'ai répondu à l'une de tes questions : application.terminate;
*Il en reste une deuxième : a mon avis ton application est figée et il ne s'agit en aucun cas d'une boucle. Mais dans la mesure ou on a pas tout les éléments dont ta base de données on ne peut pas t'aider. La seule chose que l'on peut te dire c'est de laisser tomber cette application pour l'instant et de la reprendre plus tard : tu es pas assez bon pour la faire pour l'instant. Si vraiment tu veux en faire qu'à ta tete ^^ refais entierement ton code car là RIEN NE VA (tout est à refaire).

Valide la réponse stp

@+
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonsoir,

je ne vous trouve pas très constructif, à part critiquer mon code je ne vois rien qui répond à mon problème du moment. Mon code ? En fait en y regardant de plus près il est pas si pourri que celà, les begin et les end sont à leurs place, il est perfectible c'est sûr mais on y voit bien ce que je cherche à faire, non?

En fait mon appli n'est pas figée,elle tourne bien, sauf sur un poste qui n'a pas access et j'ai beau chercher je n'ai pas trouvé de réponse. Je souhaite simplement tester si tout va bien au démarrage, comme je le fais sur Access ou VB.

Merci pour tout.

Cordialement

Codial

Alors,

*Tu parles de critiques moi je parles de conseil.

*Ensuite faut savoir Ce que tu dis : ca boucle et l'application se ferme pas ou ca marche bien sauf si tu as acces sur le poste ?? il faudrait savoir.

Alors pk je te fais ses remarques : il y a plein de "petits nouveaux" qui ont tres peu de connaissance pour pas parler de néant total, et qui se lance dans les Bases de données. Ce qui fait que l'on a le droit à une tonne de questions qui sont toujours les memes et que vous postez car :
-Vous cherchez pas
-Vous avez pas le niveau pour vous lancer la dedans.

D'une façon générale sache que les membres actifs ne font pas de Base de Données car ils aiment pas ca et que ca les gonflent (je parles aux noms de tous). Ce qui fait que quand vous postez une questions vous avez quasiment aucune chance d'avoir une réponse : du reste il suffit de voir le nb de questions sans messages.

Pourquoi on aime pas ca ? car ce n'est vraiment pas quelque chose d'interessant et qu'à votre différence nous on code pour le plaisir donc on code ce que l'on aime donc tout sauf les bases de données.

@+ et bon courage
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

personnellement les bases de données me passionnent et je connais, ma question ne portait pas directement sur les bases de données mais sur sur une syntaxe de Delphi.  Et puis ... pourquoi traiter les nouveaux avec mépris, ils cherchent, ils fouillent, ils se documentent et puis ils demandent de l'aide... Vous savez on est tous nouveaux de quelque chose un jour!!!

Pour mon code, apparemment il tient la route car sur un autre forum il n'a pas surpris et on m'a donné une explication que je vais tester. Ca au moins c'est contructif!!!!

Bonne journée

Cordialement

Codial

Bien oué on est tous nouveaux mais on commence pas tous par la fin : Les bases de données sont destinées aux initiés ou aux experts. Ils ne sont pas à la portée des débutants. D'ou le systematique rappel : "Commencer par le apprendre".

Autre remarque : apprendre à coder c'est aussi apprendre à débeuguer. Du reste il faudrait commencer par là.

Pour le application.terminate :
If not Opendialog1.execute then application.terminate;
Ca c'est la base. Comment peux tu esperer créer un soft sur les bases de données qui soit potable en ne sachant pas faire cela ?? ^^. Tu as pas l'impression d'avoir grillé les étapes.

Ensuite évite les messagebox : Rien de plus pénible pour l"utilisateut. Sans parler du fait que si ton application beug c'est encore plus pénible pour fermer l'application. De même dans une messagebox on raconte pas sa vie ^^ : un simple "Le fichier machin est absent. L'application va se fermer".

Pour finir : avant de poser une question relis là. Tu dis que ca boucle et puis après tu dis que le probleme est autre chose. Effectivement si tu ne sais pas quelle est ta question, on risque pas de pouvoir t'aider.

Ensuite : ca marche ou ca marche pas sans Access ? Bien ca n'a rien avoir avec Delphi. De plus il y a des tutos : il faut les lire.

Pour conclure : vu le nombre énorme de questions sur le sujet, chose qu'il n'y avait pas il y a encore 6 mois, je doute que les gens développent cela pour le plaisir (et puis il est rare qu'un particulier est besoin de développer une telle application pour lui). Donc faire ce genre de chose quand on en a pas le niveau, c'est carrement casse-gueule : je vous laisse méditer la-dessus.

Le topic est clos.
Messages postés
21
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
6 octobre 2008

Bonjour,


A ta question, faut-il qu'acces soit installé sur le poste client, normalement non. Tu passes par les pilotes ODBC Jet. Donc Acces n'intervient pas là dedans.


Enfin, pour ton code, voici une expliquation :
quand tu faits :
ADOConnection1.Connected:=true;

 ===> ici il boucle au début de procédure sans ecrire dans le fichier ini
            //Ecrire dans le fichier ini
            FichierIni.WriteString('DataBase','DataSource',FileName);

En passant AdoConnection1.connected  à true, tu appelles l'événement BeforeConnect, donc tu n'écris pas dans ton fichier ini.


Il faudrait plutot faire l'inverse















            //Ecrire dans le fichier ini
            FichierIni.WriteString('DataBase','DataSource',FileName);
            ADOConnection1.Connected:=true;


Ensuite, pour Application.Terminate, si tu as encore des instructions derrières, Application.Terminate ne s'exécutera pas tout de suite. Donc, tu vas tomber certainement sur des instructions qui vont attaquer ta base de données, et donc faire planter l'appli.

Une des solutions serait d'utiliser un Boolean. Tu passes sa valeur à False et dans ta boucle principale, tu testes si il est à vrai ou a Faux. Si il est à Faux alors, tu quittes sinon tu continues. Mais après cette boucle, tu ne dois plus avoir d'instructions.


Pour EXIT, effectivement, tu n'as pas besoin d'en mettre.


Voilà pour un début de réponse. Je ne suis pas non plus un expert Delphi, mais ça pourra d'aider.

Cordialement

Salut Davix,

Si je peux me permettre ^^ :

*if FileExists(FileName) then ... Else Application.terminate;
FileName ne peut pas etre définit si tu fermes l'opendialog : vrai ??. Donc si FileName n'est pas définit, la procédure ci-dessus ne pourrait pas s'executer sans un plantage magnifique ;) : If fileExists(Rien du tout) then tu as droit à un gros plantage. Pourquoi ca n'a pas lieu ? Car quand tu fermes l'opendialog, il y a un appel à un Exit : donc la procédure est fermée. Et c'est pour cela que l'application.terminate n'est pas executée.

Si tu fais If not Opendialog.execute (La réponse est un boolean ^^) then application.terminate ca fonctionne. En effet tu testes si l'opendialog a été executé ou fermé.

*En passant AdoConnection1.connected à true, tu appelles l'événement BeforeConnect : rien à avoir, cela n'empeche pas l'écriture dans le fichier ini, dans le pire des cas il faudra attendre la connection si la fonction n'est pas synchrone mais ca n'explique pas le plantage. La réponse est simple : Ou est le FreeAndNil (FichierIni); ?? Si il libère le TFileIni le fichier ne peut pas etre créer : voila d'ou vient l'erreur.

Et tout ceci n'est que les bases d'ou mes remarques : Je ne voulais pas etre vexant mais je vais en remettre une petite couche : il n'a pas le niveau pour faire ca car il ne maitrise pas le béaba.

Erreur de frappe : Si il libère PAS le TFileIni le fichier ne peut pas etre créer. Mais je pense que tu avais compris ;).

Ah oui Codial : quand j'ai sous entendu que tu ne cherchais pas j'avais raison ^^ : j'avais raison.

En effet tu n'as meme pas eu le réflexe de voir si ton fichier Ini était créer.

Apprend les bases et apprend à débeuguer plutot que de poster plus vite que ton ombre Grrrrr.

Une astuce : placer des Showmessages pour débeuguer un code :
procedure TDM.ADOConnection1BeforeConnect(Sender: TObject);
begin
path:=ExtractFilePath(Application.EXEName);
showmessage('1');
FichierIni :=TIniFile.Create(path+'CDJ.ini');
showmessage('2');
BaseEnCours:=FichierIni.ReadString('DataBase','DataSource','nonbd');
showmessage('3');
if FileExists(BaseEnCours) then
showmessage('4'); //Ect ect
begin

Ca te permet de savoir ou ca plante : c'est pas sorcier à faire quand meme ??

Allez met ton application de coté, reprend les bases et revient y plus tard : ca ira bcp mieux crois en mon expérience ;).