Bonjour, quand je compile mon projet avec Inno Setup pour obtenir une application, la base de données de l’application est toujours connectée à la base de données du projet, pourquoi. Je suis sous Delphi 10.3 Rio, BDD Access et FastReport. Merci.
Bonjour, quand je compile mon projet avec Inno Setup pour obtenir une application, la base de données de l’application est toujours connectée à la base de données du projet, pourquoi. Je suis sous Delphi 10.3 Rio, BDD Access et FastReport. Merci.
Il faut explicitement mette Active à False dans vos objets connexion et query, le design time c'est un piège pour les novices.
Toujours commit vos sources en vérifiant que tous les objets DataSet sont fermés et produire votre package inno setup via une machine de build dédié par exemple un Final Builder.
Et c'est bien dommage sachant que Firedac permet d'accéder à MSAccess, je présume donc qu'il s'agit D'ADO et, ce que votre autre post indiquait : Access (en bref 2 choses qui ne sont absolument pas à mon goût)
Il faut "simplement" indiquer ADOconnection.Connected à False avant de compilerj'ai beau chercher et je ne me retrouve toujours pas
De même si vous voulez déployer sur un autre poste, vous devez vous assurer qu'Access est bien installé sur le poste en question
Ah voilà enfin un truc intelligent pour les utilisateurs de SQL en l'IDE, ce que je ne suis pas
En ORA, je me suis fait ceci qui est très facilement adaptable à un TADOConnection ... l'utilisant en 100% allocation dynamique au RunTime où je travaille actuellement, je n'ai pas besoin de ce genre de protection qui était utile dans un ancien taf où le DataModule avait été choisi comme "coeur" de la partie DB, j'ai toujours préféré un mode plus Code que RAD.
OraSessionEx.inc
OraSessionEx.Impl.inc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 TOrasession = class(Ora.TOraSession) private function GetConnectedAllowed(): Boolean; protected procedure SetConnected(Value: Boolean); override; public property ConnectedAllowed: Boolean read GetConnectedAllowed; end;
et l'utilisation dans un objet commun à tous les applications et quelques fois dans un autre DataModule lors qu'il y avait un second objet TOrasession :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 { TOrasession } procedure TOrasession.SetConnected(Value: Boolean); begin if (Value and ConnectedAllowed) or not Value then inherited else raise exception.Create('Erreur DEVELOPPEUR : Connexion session Oracle ouvert par défaut !' +sLineBreak+sLineBreak+'Conctactez le support APPS.'); end; function TOrasession.GetConnectedAllowed(): Boolean; begin Result := not (csLoading in ComponentState); end;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 interface uses Windows, ..., DBAccess, Ora, OraSmart, MemDS, OraError ...; type {$I OraSessionEx.INC} TCommonMainDataModule = class(TDataModule) MainSession: TOraSession; qry...: TOraQuery;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 implementation {$R *.DFM} uses ...; {$I OraSessionEx.Impl.INC}
Bonjour, j'ai essayé pas mal de choses et toujours PAS de solutions.
En réalité, on ne comprend pas le problème
Titre "Comment connecter une BDD pour une compilation."
Contenu "quand je compile mon projet avec Inno Setup pour obtenir une application, la base de données de l’application est toujours connectée à la base de données du projet, pourquoi."
Pour le titre, cela n'a pas de sens
Pour le contenu, suffit de mettre les Active à False partout, cela demande juste un peu de rigueur, créer un fichier ini pour stoker la config qui sera construire via un écran InnoSetup et créer la ConnectionString au RunTime en lisant le fichier ini, sans oublier de chiffrer le mot de passe dans le ini.
C'est votre titre de message qui n'est pas clair, je pense que vous vouliez parler de "déploiement d'une application et sa base de données (ACCESS) avec InnoSetup"
La dernière réponse de ShaiLetroll est pourtant explicite et même un peu plus
pour reprendre
- Pour le contenu (Entendez par là le programme) , suffit de mettre des Active à False partout, cela demande juste un peu de rigueur
- créer un fichier ini pour stoker une configuration qui sera construit via un écran InnoSetup
- créer la ConnectionString au RunTime (donc niveau programme) en lisant le fichier ini << ce qui sera fait dans le OnCreate du datamodule ou de la forme principale
- sans oublier de chiffrer le mot de passe dans le ini. << ça c'est le plus
La clé de la solution, c'est le besoin d'un fichier ini pour paramétrer la connexion au niveau de l'exécution du programme et que ce fichier ini doit être "fourni et modifié" quand l'exécution du programme d'installation (créé avec Innosetup) se déroule.
Mais vous ne nous avez fourni aucun code pour nous montrer comment était faite la connexionj'ai essayé pas mal de choses et toujours PAS de solutions.
montrez le code de connexion (fichier ini ou non dépendant d'où vous voulez placer la BDD) et nous en reparlerons
Bonjour,
Un code quelconque lors de l'installation modifie-t-il le chemin de la BDD ?
Voici des détails qui peuvent régler le problème : Dans TForm1, j'ai ADOConnection1, 4xADOTable et 4xDataSource, 3xDBGrid et 3xDBNavigator. Pour la connection (sans code), propriétés ADOConnection1, ConnectionString, Construire: Fournisseur = Microsoft Jet 4.0 OLE DB Provider, Connexion = 1.Selection de la base de données, Propriétés avancés- Autorisations d'accés = Share Deny None, OK, OK. Puis connected = True et LoginPrompt = False. Pour ADOTable1, Active = True, Connection = ADOConnection1 et TableName = Nom de table. Pour DataSource1, DataSet = ADOTable1. La meme opération est repetée pour les 3 autres ADOTable et DataSource. Pour DBGrid et DBNavigator, DataSource = DataSource1. Voila des details, si vous avez besoin d'autres, vous me le demandez. Merci.
le Problème est là, vous devez manuellement AVEC du code construire la ConnectionString à partir d'un fichier ini (ou autre, xml, json ce que vous préférez)
Et via InnoSetup, l'intégrateur installe votre application, configure le Provider\Driver (si vous laissez le choix entre Jet, Ace, ODBC)
l'intégrateur choisit via un Selecteur de dossier\fichier où sera le fichier Base de Données, fournir un fichier vierge est opportun
Eventuellement, il ajoute un mot de passe, à vous de le chiffrer dans le fichier ini
cela donne au démarrage du projet
ou encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part ADOConnection1.ConnectionString := Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Jet OLEDB:Database Password=%s;', [DBPathFromIni, Decrypt(PasswordFromIni)]);
A vous de voir votre Provider favori
Code : Sélectionner tout - Visualiser dans une fenêtre à part ADOConnection1.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password=%s;', [DBPathFromIni, Decrypt(PasswordFromIni)]);
Je vous laisse lire la documentation de InnoSetup pour créer des écrans de saisie et le lien entre écran avec le fichier ini
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 [INI] Filename: "MyProg.ini"; Section: "InstallSettings"; Flags: uninsdeletesection Filename: "MyProg.ini"; Section: "InstallSettings"; Key: "DBPath"; String: "{db}"
Pensez dans InnoSetup a proposer un écran de téléchargement du driver depuis une page Microsoft.
A mettre à False dans les propriétés en DesignTime
A mettre à True dans le code après avoir défini ConnectionString en RunTime
CQFD !
ConnectionString à partir d'un fichier ini ??? J'ai appris uniquement la ConnectionString decrite ci-dessus, je suis debutant !!! Si vous pouvez detailler un peu plus.
Bonjour
Nous lister, de façon difficilement lisible, les composants utilisés, n'est pas nous fournir le code demandé !
Au passage, je note que vous n'avez toujours pas indiqué un point important : la version de Delphi
Ce qui explique certainement beaucoup de choses, comme la non mise en considération de l'utilisation d'un vrai SGBD, les composants non renommés, etc.Envoyé par nacer0806dz
Après une réflexion comme celle-ciSi vous pouvez détailler un peu plus.
vous vous rendez compte qu'il faut tenir compte de ce qui a été écrit, il serait temps de vous excuser.vos réponses sont sans détails et souvent hors sujet
on reprend :
Pour lire un fichier Ini FAQ
Tout d'abord créer un fichier ini et sa structure, avec un simple éditeur de texte, le minimum sera quelque chose comme ça
Code Ini : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [base] chemin = chemin et nom de la bdd
* La version de Delphi non indiqué, je montre ce qu'il en serait avec une version XE4 +
Maintenant, quelques conseils de pro (je pense en être un)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 uses vcl.inifiles; // unité nécessaire procedure Form1.Create(Sender : TObject); var F : TIniFile; dbpath : String; begin F:=TIniFile.Create('config.ini'); // ici dans le même endroit que l'exe dbpath:=F.ReadString('base','chemin','cemincompletdela bdd'); ADOConnection1.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s', [DBPathFromIni]); // pour la partie provider (entre ' '), récupérez celle qui est en dur // et modifiez en fonction : remplacer le chemin de la BDD par %s ADOConnection1.Connected:=True; .... end;
pensez à mettre le fichier ini dans un endroit sûr, logiquement sous windows, ce serait dans un chemin particulier de windows récupérable par GetHomePath (si pour un seul utilisateur) ou GetPublicPath (tous les utilisateurs du poste)https://docwiki.embarcadero.com/RADS...ises_en_charge
il faudrait donc ajouter l'utilisation de l'unité System.IOUtils et "calculer" l'emplacement
(pour une version <XE4 il faudra passer par une obtention de répertoires spéciaux)
Utilisez plutôt un DataModule pour tout ce qui est données (couche métier), je ne vais pas en dire davantage vu votre niveau cela va vous perdre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 var ... inifilename : String; begin inifilename:=Tpath.Combine(Tpath.GetHomePath,'config.ini'); if not FileExist(inifileName) then Tpath.Combine(Tpath.GetPublicPath,'nomdufichier.ini'); // par défaut je prends une version "pour tout les utilisateurs du poste " sauf cas explicite F:=TIniFile.Create(inifilename); ...
Bien sûr, comme ShaiLeTroll l'a signalé, protéger avec un mot de passe la BDD est fortement conseillé, j'ai omis de le coder intentionnellement pour ne pas indiquer en plus la partie cryptage de ce dernier.
Passez à un bon SGBD, ce n'est pas parce que vous avez appris avec Access qu'il n'y a pas mieux, (loin de là) vous m'en remercierez quand on vous demandera d'utiliser plusieurs postes sur une même base de données (multi-utilisateur)
Enfin, si vous avez la possibilité Firedac, utilisez ces composants
Bonjour, la version de Delphi utilisée (mentionnée deja tout au debut) est 10.3 Rio, ainsi je dois avoir raison de mes remarques.
Quelle partie a besoin d'être détaillée ?
Nous avons tous été débutant, et il faut donc se lancer, se tromper, faire des erreurs, oser mais comme on ignore ce que vous avez essayé, on ne peut donc vous dire ce qu'il faut que vous corrigiez.
Considérez que tout ce que vous avez appris ne représente qu'un début, presque 25 ans de carrière, j'apprends encore tous les jours, dans un tas de domaine, c'est ça le métier de développeur, c'est savoir trouver l'information, et cela ne peut être fait que par soi-même, chercher, chercher et chercher encore.
Si vous appris une méthode, chercher à en apprendre une autre, vous avez tout le code possible à ce sujet, avec vous lu Data.Win.ADODB.TADOConnection.ConnectionString et les pages associées ?
Avez vous déjà réussi à supprimer les informations de la ConnectionString en DesignTime pour remplacer cela par du code dans le OnCreate de la Form par exemple pour constuire la ConnectionString en RunTime
Il faut commencer simplement !
Poser un TEdit sur votre fiche TForm1, il sera nommé Edit1 (ou un autre numéro si il y en a déjà qui n'ont pas été renommé)
Renseigner un chemin dans Edit1 comme par exemple 'C:\myFolder\myAccessFile.mdb'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName; end;
Comme vous le voyez pour une installation, il faut un fichier de paramétrage externe à votre programme, c'est cela qui seul permettra de configurer librement quel sera le fichier Access à utiliser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ADOConnection1.ConnectionString := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;', [Edit1.Text]); ADOConnection1.Connected := True;
Peut-être voir avec votre formateur, celui qui vous enseigne le Delphi pour découvrir une autre façon de faire, vous savez que vous devez utiliser un TIniFile, vous pourriez donc échanger à ce sujet, cela montrera que vous avez trouvé une solution mais qu'il vous faut de l'aide pour la mettre en place.
Cela peut aussi être en Base de Registre, soit un TRegistry au lieu d'un TIniFile c'est un autre moyen, cela reste un paramètre externe.
Je ne vois pas comment être plus précis, il faut que vous étudiez les tutoriels, cela commence justement par ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TForm1.Button1Click(Sender: TObject); var cheminBD, chaineCnx : string; begin cheminBD := 'C:\Bases\Biblio.mdb' ; chaineCnx:= 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'User ID=Admin;' + 'Data Source=' + cheminBD + ';' + 'Mode=Share Deny None;Extended Properties="";' + 'Jet OLEDB:Engine Type=5;' ; ADOXCatalog1.Create1(chaineCnx); end;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager