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

Delphi Discussion :

Aide-moi à trouver la solution


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2022
    Messages : 18
    Par défaut Aide-moi à trouver la solution
    DELPHI XE7 Comment détecter automatiquement le nom de serveur de PC pour connecté la base de donne SQL Server 2008 automatiquement
    j'ai crée un projet Contient:
    - Data Module : ADOConnexion / ADOTable / ADOQuery / DataSource
    - plus de 15 FORM Lié à Data Module
    - Base De Donneé SQL Server 2008
    Je souhaite que l'application se connecte automatiquement au serveur Mais tout ce que j'ai fait n'a pas fonctionné

    voila C'est ce que j'ai fait mais na pas marché

    1 - j'ai creé un fichier "INI" nomé 'config.ini' et j'ai posé se fichier dans 'Debug' du projet creé
    dans le fichier Config.Ini j'ai écrit

    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [Connexion]
    Serveur=PosteA\SQLEXPRESS   ////// le Nom De Mon Serveur 
    BaseDeDonnees=Gestion_Empl    ////// le de ma BDD SQL SERVER

    2- Dans la page de l'éditeur des codes du Data Module j'ai écrit le code suivant:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    unit DataModule;
     
    interface
     
    uses
      System.SysUtils, System.Classes, Data.DB, Data.Win.ADODB, IniFiles;
     
    type
      TDM = class(TDataModule)
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        ADOTable2: TADOTable;
        ADOTable3: TADOTable;
        ADOTable4: TADOTable;
        ADOTable5: TADOTable;
        ADOTable6: TADOTable;
        ADOTable7: TADOTable;
        ADOTable8: TADOTable;
        DataSource2: TDataSource;
        DataSource3: TDataSource;
        DataSource4: TDataSource;
        DataSource5: TDataSource;
        DataSource6: TDataSource;
        DataSource7: TDataSource;
        DataSource8: TDataSource;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
      private
     
        { Déclarations privées }
      public
        procedure InitialiserConnexion;
        procedure DeconnecterTables;
        { Déclarations publiques }
      end;
     
    var
      DM: TDM;
     
    implementation
     
    {%CLASSGROUP 'Vcl.Controls.TControl'}
     
    uses Form1, Form2, Form3, Form4, Form5, Form6, Form7,
      Form8, Form9, Form10;
     
    {$R *.dfm}
     
    procedure TDM.InitialiserConnexion;
    var
      IniFile: TIniFile;
      Serveur, BaseDeDonnees: string;
    begin
      IniFile := TIniFile.Create('config.ini');
      Serveur := IniFile.ReadString('Connexion', 'Serveur', '');
      BaseDeDonnees := IniFile.ReadString('Connexion', 'BaseDeDonnees', '');
      IniFile.Free;
     
      ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=' + BaseDeDonnees + ';Data Source=' + Serveur;
      ADOConnection1.Connected := True;
     
      // Activer les tables
        ADOTable1.Active := True;
        ADOTable2.Active := True;
        ADOTable3.Active := True;
        ADOTable4.Active := True;
        ADOTable5.Active := True;
        ADOTable6.Active := True;
        ADOTable7.Active := True;
        ADOTable8.Active := True;
        ADOQuery1.Active := True;
    end;
     
     
    procedure TDM.DeconnecterTables;
    begin
      // Désactiver les tables
        ADOTable1.Active := False;
        ADOTable2.Active := False;
        ADOTable3.Active := False;
        ADOTable4.Active := False;
        ADOTable5.Active := False;
        ADOTable6.Active := False;
        ADOTable7.Active := False;
        ADOTable8.Active := False;
        ADOQuery1.Active := False;
     
      // Déconnecter la connexion
      ADOConnection1.Connected := False;
    end; 
     
    end.
    3- Dans la page de l'éditeur des codes du Principale 'FORM1' j'ai écrit le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     
      DM.InitialiserConnexion;
     
    end;

    Aide-moi à trouver la solution.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 041
    Par défaut
    Détecter automatiquement ?
    Souhaitez-vous un scan des Ports TCP ouverts sur une plage IP ?

    Bon juste un mauvais vocabulaire, vous souhaitez juste avoir un fichier de configuration
    Déjà " \Debug\ " est-ce le bon endroit n'est-ce pas " \Debug\Win32\ " ?
    Attention à l'UAC si le fichier ini est placé dans certains dossiers (ne surtout rien mettre dans Program Files par exemple)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uses Form1, Form2, Form3, Form4, Form5, Form6, Form7,
      Form8, Form9, Form10;
    Le nommage et la présence de tous ces uses est fortement inquiétant pour la pérennité du projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOTable2, ADOTable3 ....
    Faut renommer tout cela !


    Veillez à mettre en DesignTime Connected à False ainsi que Active à False sur tous les ADODataSet (Table, Query ...)
    L'utilisation du RAD provoque souvent une valeur par défaut de ConnectionString et un Connected à True qui tente de se connecter à la base dès la création du DataModule, c'est un piège pour les débutants.

    L'ordre de création entre le DataModule et Form est-il bon ?

    TADOTable à éviter avec un SGBD distant SQL comme l'est SQL Server 2008, c'est une très mauvaise pratique, lent et peu efficace, remplacer tout cela par des TADOQuery avec un volume de données limité, n'utilisez pas Locate non plus !


    PosteA\SQLEXPRESSC'est le nom de l'instance ?
    PosteA seulement ou l'adresse IP est suffisant
    Utilisez l'assistant ODBC pour construire votre chaine

    SQLOLEDB.1Attention, provider totalement obsolète
    A remplacer par SQLNCLI11.1 ou MSOLEDBSQL.1Cela ressemble à une chaine tout a fait correcte, pour ma part, je crée à la volée les TADOConnection et TADOQuery, sans DataModule, ce dernier n'apporte pas grand chose, même pire cela donne de mauvaises habitudes si l'on ne fait pas l'effort de travailler en objet métier avec un pseudo conception MVC à la sauce Delphi

    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
    //------------------------------------------------------------------------------
    class function TConfigManager.TConnectionByConnectionString.MakeConnectionString(const AServer, ACatalog, ALogin, APassword: string): string;
    const
      FMT_CONNECTION_STRING_BY_PROVIDER = 'Provider=%s;Persist Security Info=False;Data Source=%s;Initial Catalog=%s;User ID=%s;Password=%s;Initial File Name="";Server SPN="";Application Name=***';
      FMT_CONNECTION_STRING_BY_PROVIDER_AND_DRIVER = 'Provider=%s;Driver={%s};Server=%s;Database=%s;UID=%s;PWD=%s;Application Name=***';
    var
      iSep: Integer;
    begin
      if TConfigManager.DBProvider = '' then
        TConfigManager.DBProvider := 'MSOLEDBSQL.1';
     
      iSep := Pos('\', TConfigManager.DBProvider);
      if iSep > 0 then
      begin
        Result := Format(FMT_CONNECTION_STRING_BY_PROVIDER_AND_DRIVER, [Copy(TConfigManager.DBProvider, 1, iSep - 1), Copy(TConfigManager.DBProvider, iSep + 1), AServer, ACatalog, ALogin, APassword]);
      end
      else
        Result := Format(FMT_CONNECTION_STRING_BY_PROVIDER, [TConfigManager.DBProvider, AServer, ACatalog, ALogin, APassword]);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 577
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Je suggérerai déjà de changer le titre par quelque chose de plus parlant, par exemple ADO : créer une Chaine de connexion à partir d'un fichier .ini

    Ensuite le fichier ini devrait être positionné dans un endroit comme c:\programdata\<nom programme> une utilisation de system.IOUtils devrait certainement aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iniName:=Tpath.Combine(Tpath.GetPublicPath,TPath.GetFileNameWithoutExtension(paramstr(0)));
    if not DirectoryExists then Forcedirectories(ininame);
    ininame:=Tpath.Combine(ininame,Config.Ini);
    pour le reste, même questionnement que ShaiLeTroll

    enfin, plutôt que le code au point 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DM.InitialiserConnexion;
    end;
    Je ferai en sorte de créer le module de données AVANT la forme principale (soit en modifiant le source du projet soit via les options du projet : l'ordre des fiches)

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2022
    Messages : 18
    Par défaut
    @shailetroll ça n'a pas fonctionné No se ni pas une application reseau c'est une application mono-utilisateur et monoPoste

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 932
    Par défaut
    Dire que ça ne marche pas, ça sert strictement à rien.
    Il serait plus utile de nous dire sur quelle ligne cela plante et quel message d'erreur tu obtiens.

    As-tu essayé de te connecter en utilisant l'assistant fourni avec les composants ADO ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 577
    Billets dans le blog
    65
    Par défaut
    Pour être plus explicite.

    Dans le DataModule j'écrirai

    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
     
    fonction TDM.InitialiserConnection : Boolean;
    var
      IniFile: TIniFile;
      IniFileName : String;
      Serveur, BaseDeDonnees: string;
    begin
    iniFileName:=Tpath.Combine(Tpath.GetPublicPath,TPath.GetFileNameWithoutExtension(paramstr(0)));
    if not DirectoryExists then Forcedirectories(inifileName);
    inifileName:=Tpath.Combine(inifile,'Config.Ini');
    IniFile := TIniFile.Create(IniFileName);
    try
     Serveur := IniFile.ReadString('Connexion', 'Serveur', '');
     BaseDeDonnees := IniFile.ReadString('Connexion', 'BaseDeDonnees', '');
    finally
      IniFile.Free;
    end;
    if ADOConnection1.Connected then ADOConnection1.Connected:=False; // AH ON A OUBLIE DE LE DECONNECTER DANS LE DESIGN ça risque de planter  !
    if Serveur.isEmpty OR BasedeDonnees.isEmpty then result:=false 
    else begin
      ADOConnection1.ConnectionString := Format('Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s',[BasedeDonnees,Serveur]);
      try begin 
         ADOConnection1.Connected := True;
         Result:=ADOConnection1.Connected;
      except
        raize;
      end; 
    end;
    ADO n'étant pas ma tasse de thé, je ne me suis pas penché sur le provider
    Perso, je préfère nettement que seules les tables nécessaires à une forme soient ouvertes par celle-ci, donc ces ADOtables.Active me passent au dessus de la tête

    c'est une application mono-utilisateur et monoPoste
    Je présume que la version de XE7 est une version pro d'où le choix de ADO pour se connecter à SQL Server ?
    Utiliser SQL Server pour ça, c'est SQLite serait plus adapté et plus léger de plus cela permettrait d'utiliser Firedac et dire adieu à ADO.

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/03/2007, 16h28
  2. aide pour trouver la solution pour quelques algorithmes
    Par abdoue2004 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 24/01/2007, 14h57

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