IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

CONFIGURER AUTOMATIQUEMENT L'ODBC"delphi acces bde"


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 9
    Points : 8
    Points
    8
    Par défaut CONFIGURER AUTOMATIQUEMENT L'ODBC"delphi acces bde"
    salut à tous j'ai une petite application delphi access que je simule en reseau. Actuellement j'indique le chemin reseau de la BD lors de la configuration de l'ODBC pour y acceder. Est t'il possible de faire que se soit automatique? je m'explique : concevoir une interface dans la quelle je présice l'alias reseau de la machine ou se trouve la BD et m'y connecter des que je valide. dite moi comment je peu contourner cette configuration manuelle si non
    Merci d'avance?

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour,

    Tu disposes de beaucoup de SGBDR C/S gratuit donc je trouve dommage de devoir se restreindre à Access pour une application censée être multiposte.

    Passer à Firebird (par exemple, c'est entièrement gratuit sous Windows), te permet de t'affranchir des lecteurs réseaux que tu dois configurer chaque fois (entre autres). De plus, c'est plus facile d'installer et de configurer l'application.

    Le problème de la config manuelle n'est pas, cela dit, tellement inhérent à Access, mais à mon avis, plutôt de la façon dont l'application a été codée.
    Pour ne pas entrer dans le détail, je vais directement en venir au fait.


    Les sources de données ODBC sont recensées dans le registre. Il t'est donc possible de créer/modifier/supprimer une source de données ODBC directement en éditant le registre.

    J'ai écrit un programme que j'utilise lors du déploiement de mes applications (le SGBD est MySQL). Dans le programme, j'accède comme toi à la base de données via ODBC. Dans le programme, j'utilise un alias; et afin de faciliter l'installation, le programme me permet de configurer automatiquement l'alias c'est à dire de créer automatiquement le DSN et même de créer la base de données.

    Comment je crée le DSN ?

    http://delphi.developpez.com/faq/?pa...c#creationodbc

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    procedure TMainForm.CreateDSN(DataBaseName, PassWord, Server,
    	User: String);
    begin
    	with TRegistry.Create do
    		try
    			RootKey := HKEY_CURRENT_USER;
    			OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources',false);
    			WriteString(DataBaseName,'MySQL ODBC 3.51 Driver');
    			{ Ecriture des paramètres (2) }
    			if not OpenKey('\Software\ODBC\ODBC.INI\' + DataBaseName,true) then
    				raise Exception.Create('impossible de créer la clé : '+
    																 '<\Software\ODBC\ODBC.INI\' + DataBaseName+'>');
     
    			if not FileExists(SystemDirectory + '\myodbc3.dll') then
    				raise Exception.Create('Les pilotes d''accès à MySQL doivent être installés.#13#10' +
    								' Consultez le sous repertoire Outils pour installer les pilotes.');
     
    			WriteString('DATABASE', DataBaseName);
    			WriteString('Driver', SystemDirectory + '\myodbc3.dll');//DONE : Windows folder
    			WriteString('OPTION','43');
    			WriteString('PWD', PassWord);
    			WriteString('SERVER', Server);
    			WriteString('UID',User);
     
    			ShowMessage('DSN crée! A présent, tester la connexion puis créer la base de donnée');
    		finally
    			Free;
    		end;
    end;
    Les paramètres d'appels sont faciles à comprendre. La fonction SystemDirectory me permet de recupérer le répertoire SYSTEM de Windows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function TMainForm.SystemDirectory: String;
    const
      dwLength: DWORD = 255;
    var
      SystemDir: PChar;
    begin
      GetMem(SystemDir, dwLength);
      GetSystemDirectory(SystemDir, dwLength);
      Result := String(SystemDir);
    	FreeMem(SystemDir, dwLength);
    end;
    Je n'ai pas vérifiée mais elle doit être dans la FAQ...

    Ensuite, une fois que je peux créer le DSN, il me faut un moyen pour le supprimer lors de la désinstallation par exemple. Je fais comme cà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TMainForm.DeleteDSN(DSNName: String);
    begin
    	with TRegistry.Create do
    		try
    			//Delete the Key previously created!
    			RootKey := HKEY_CURRENT_USER;
    			OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources',false);
    			DeleteValue(DSNName);
    			OpenKey('\Software\ODBC\ODBC.INI',False);
    			DeleteKey(DSNName);
    		finally
    			Free;
    		end;
    end;
    Pour créer la base de données, j'utilise un fichier .bat qui contient la ligne de commande pour l'exécution du script SQL que je désire exécuter. En utilisant ShellExecute, tu peux ensuite appeler le .bat et créer la base.
    Le contenu du .bat ressemble à :

    mysql -u root < Script.sql -p
    Et la fonction pour créer la base de données :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    function TMainForm.CreateDataBase: Boolean;
    var
    	F : TextFile;
    	Chaine : String;
    	BatFilePath, ScriptPath : String;
    	APath : String;
    	Code : Integer;
    begin
    	Result := False;
    	APath := ExtractFilePath(Application.ExeName) + '\SQL\';
    	try
    		BatFilePath := APath + 'CreateDatabase.bat';
    		ScriptPath := 'Script.sql';
    		AssignFile(F, BatFilePath);
    		Rewrite(F);
    		Chaine := 'mysql -u ' + edUser.Text + '  < ' + ScriptPath + ' -p' + edPassword.Text;
    		Writeln(F, Chaine);
    		CloseFile(F);
    	except
    		begin
    			ShowMessage('Fichier bat inexistant! La réinstallation de l''application peut corriger le problème');
    			Exit;
    		end;
    	end;
     
    	//Execute the bat file
    	Code := ShellExecute(
    		Application.Handle,
    		'open',
    		PChar(GetEnvironmentVariable('ComSpec')),
    		'/C CreateDatabase.bat',
    		PChar(APath),//PChar(ExtractFilePath(Application.ExeName) + '..\Base de donnée\'),
    		SW_SHOW);
     
    	if Code <= 32 then
    		Result := False
    	else
    		Result := True;
    end;
    TryConnect est utilisé pour tester si la connexion à la base de données peut être établie. Cela ne servirait à rien sinon de créer la base ...

    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
    16
    17
    18
    19
    function TMainForm.TryConnect(DSNName, UserName: String): Boolean;
    begin
    	Result := False;
    	try
    		ADOCOnnection.Provider := 'MSDASQL.1';
    		ADOConnection.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;' +
    				'User ID=' + UserName + ';Data Source=' + DSNName;
    		ADOConnection.Open;
    		Result := True;
    		ShowMessage('Connexion réussie');
    	except
    		on E : Exception do
    		begin
    			Result := False;
    			ShowMessage('Paramètres mal configurés ou serveur MySQL non lancé/inexistant! Le DSN crée vas être effacé!!!');
    			DeleteDSN(edDataBaseName.Text);
    		end;
    	end;
    end;
    Il reste deux problèmes à résoudre :
    - comment tester la connexion au SGBD au démarrage puisque notre base de données n'est pas encore créee ?
    - comment transférer tes données de ta base Access vers Firebird/MySQL ?

    Pour le premier problème, il faut juste se rappeler que dans le cas de MySQL, la base mysql existe toujours, l'idée est donc de créer un DSN pour se connecter à cette base, puis exécuter le script. Cà donne ceci :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    var
    	TempDSN : String;
    begin
    	TempDSN := 'mysql';
     
    	try
    		//First Create a DSN to the system database : MySQL
    		CreateDSN(TempDSN, edPassword.Text, edServerAdress.Text, edUser.Text);
    		try
    			//Click the connection button
    			if TryConnect(TempDSN, edUser.Text) then //Connection successful
    			begin
    				//Create the User DSN if success
    				CreateDSN(edDataBaseName.Text, edPassword.Text, edServerAdress.Text, edUser.Text);
     
    				if CreateDataBase then
    				begin
    					MessageDlg('La base de donnée a été correctement crée!', mtInformation, [mbOK], 0);
    					Close;
    				end
    				else
    					MessageDlg('Erreur de création de la base de donnée', mtError, [mbOK], 0);
     
    			end
    			else //Can't connect
    				MessageDlg('Impossible de se connecter à la base de donnée! ' + #13#10 +
    								'Paramètres incorrects ou serveur non lancé/inexistant', mtError, [mbOK], 0);
    		except
    			On E : Exception do
    			begin
    				ShowMessage(E.Message);
    			end;
    		end;
    	finally
    		//In any case, delete the temporary created DSN
    		DeleteDSN(TempDSN);
    	end;
    Maintenant, en ce qui concerne le transfert des données, tu peux utiliser l'utilitaire DataPump livré avec D7 et antérieur. Tu vas dans Programmes -> Borland Delphi 7/6/5/ et tu lances l'utilitaire en question. Tu suis les étapes de l'assistant en t'assurant de remplir les préréquis notamment les alias pour les bases sources et cibles.

    Tu peux également faire cela "manuellement" en créant le même schéma des tables puis en recopiant toi même les données. Il te faudra alors "désactiver" les contraintes d'intégrités référentielles dans la base cible avant de commencer le transfert sinon tu pourrais avoir des problèmes lors de la recopie des données.


    Par ailleurs, il te reste possible de connecter toi même un lecteur réseau à partir de ton application. Ce que tu peux alors faire c'est d'ajouter un bouton et proposer à l'utilisateur à l'utilisateu de reconnecter ou alors, tu utilises un timer et après un intervalle de temps, si la connexion n'est pas établie, tu recommences.

    Comment connecter un lecteur réseau ?
    Nono40 te donne la solution sur son site
    http://nono40.developpez.com/sources/source0020/


    Voilà, je pense avoir répondu à la question dans son ensemble.

    A bientôt et courage pour ton développement.

Discussions similaires

  1. Creer un installable Delphi Mysql Bde Odbc
    Par ACILETECH dans le forum Bases de données
    Réponses: 6
    Dernier message: 23/07/2013, 19h30
  2. Réponses: 3
    Dernier message: 15/03/2006, 10h15
  3. acceder à la page gestionnaire de sources ODBC depuis delphi
    Par lassad dans le forum Bases de données
    Réponses: 1
    Dernier message: 11/10/2005, 15h33
  4. Différence entre un driver ODBC et un accès natif à un SGBDR
    Par brice01 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 13/12/2004, 17h24
  5. BDE : Configurer automatiquement le NETDIR
    Par Harry dans le forum Paradox
    Réponses: 10
    Dernier message: 29/07/2002, 11h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo