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 :

FireDAC / MSSQL


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Informatique Industrielle
    Inscrit en
    Février 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur Informatique Industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 25
    Par défaut FireDAC / MSSQL
    Bonjour,

    J'utilise FireDAC depuis peu, j'apprend principalement grâce à l'aide DELPHI. Malheureusement, l'aide ne répond pas toujours à mes attentes. J'aurais donc aimé être aiguillé vers un tutoriel (s'il en existe un).

    Par la même occasion, j'en profite pour poser 2-3 questions concernant mon code.
    (Pour toutes les questions qui vont suivre, j'utilisais de base le composant ADO. Il est donc possible que certaines parties soient totalement incohérentes avec les composants FireDAC)

    Pour la connexion avec mon serveur, je procède de la façon suivante :

    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
     
      with FDConnectionEvent do Begin
        DriverName := 'MSSQl';
        LoginPrompt := false;
        with ResourceOptions do begin
          CmdExecMode := amAsync;
        end;
        with params do Begin
          Database := CatalogEvent;
          DriverID := 'mssql';
          Password := mdp;
          Pooled := false;
          username := User_ID;
          Add('server=' + Nom_Serveur);
          Add('Database=' + CatalogEvent);
          Add('DriverID=MSSQL');
        End;
      End;
     
      FDConnectionEvent.Close();
     
      try
        FDConnectionEvent.Open();
      except
        ConsoleTrace('Probleme dans l''ouverture de la connexion MSSQl.',Debugglevel1);
      end;
    J'arrive à tester la connexion. J'ai cependant un problème dans le temps de retour de la non connexion. C'est à dire que l'application prend entre 15-30 secondes pour me retourner qu'elle n'est pas connectée. Y'aurait il un paramètre (style TimeOut ou ConnectionTimeOut) à implémenter pour que ça prenne moins de temps.

    Pour ce qui est de la lecture et de l'écriture, voici mon code :

    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
               with FDConnection do Begin
                            DriverName := 'MSSQl';
                            LoginPrompt := false;
                            with ResourceOptions do begin
                              CmdExecMode := amAsync;
                            end;
                            with params do Begin
                              Database := Catalog;
                              DriverID := 'mssql';
                              Password := mdp;
                              Pooled := false;
                              username := User_ID;
                              Add('server=' + Nom_Serveur);
                              Add('Database=' + Catalog);
                              Add('DriverID=MSSQL');
                            End;
                          End;
     
                          FDConnection.Close();
     
                          try
                            FDConnection.Open();
                          except
                            ConsoleTrace('Probleme dans l''ouverture de la connexion MSSQl.',Debugglevel1);
                          end;
     
                          FDQuery.Connection:=FDConnection;
     
                          FDQuery.SQL.Clear;
                          CommandeSQL := 'Select * From ' + Nom_Table;
                          FDQuery.SQL.ADD(CommandeSQL);
                          FDQuery.Open;
                          FDQuery.Last;
     
                          try
                            Num_index:=FDQuery.Fields.Fields[0].Value+1;
                          except
                            Num_index:=1;
                          end;
                          CommandeSQL := CommandeSQl + ');';
                          FDQuery.SQL.Clear;
                          FDQuery.SQL.Add(CommandeSQL);
                          FDQuery.ExecSQL;
                          FDQuery.SQL.Clear;
    Ce code fonctionnait avec le composant ado mais ne fonctionne plus avec le composant FireDAC. Je ne vois pas comment traduire mes Fields.Fields et mes Last interminables. Je prend tous les conseils à partir de ce point ci.
    Es-ce que changer mon composant FDQuery par un composant FDTable pourrait m'arranger ?

    Enfin, j'ai également ce code pour effectuer une lecture/écriture qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ConsoleTrace('Connecte a MSSQL',DebuggLevel1);
          if FDConnectionEvent.ExecSQLScalar('Select MAX(NO_EVENT) From ' + Nom_tableEvent) = null then
            Begin
              Old_No_Event:=1;
            End
          else
            Begin
              Old_No_Event := FDConnectionEvent.ExecSQLScalar('Select MAX(NO_EVENT) From ' + Nom_tableEvent);
              Inc(Old_No_Event,1);
            End;
          FDConnectionEvent.ExecSQL('Insert into ' + nom_tableEvent + ' values (' + inttostr(Old_No_Event) + ',''' + formatdatetime('yyyy/mm/dd',today) + ''',''' + timetostr(now) + ''',''Démarrage de l ApiSoft'','''',''ApiSoftMou'');');
          ConsoleTrace('Enregistrement EVENEMENT OK: structure OK', DebuggLevel1);
    Le ExecSQLScalar ne peut renvoyer qu'un enregistrement (si j'ai bien compris la doc). Je ne peux donc pas faire de select * avec par exemple. A l'inverse, si je peux faire toutes mes requêtes avec mon FDConnection, quels intérêts ont FDQuery et FDTable ?

    Merci par avance pour toute réponse apportée. Même si elles ne répondent pas à l'intégralité des questions posées.

    Cordialement.

  2. #2
    Rédacteur/Modérateur

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

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

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

    je constate que ce que j'avais écrit dans ce post est resté lettre morte du moins en grande partie en ce qui concerne la connexion

    Le ExecSQLScalar ne peut renvoyer qu'un enregistrement (si j'ai bien compris la doc). Je ne peux donc pas faire de select * avec par exemple.
    c'est pas tout à fait ça http://docwiki.embarcadero.com/Libra....ExecSQLScalar
    ExecSQLScalar renvoie la valeur de la première colonne dans la première ligne du premier ensemble de résultats.
    donc on peut très bien écrire un "select * from table" bien que cela soit
    à propos de ExecSQLScalar ton utilisation en est incorrecte, pour la partie récupération du dernier numéro ce code devrait faire la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Old_No_Event:=FDConnectionEvent.ExecSQLScalar('Select MAX(NO_EVENT)+1 From ' + Nom_tableEvent);
         if Old_No_Event.isNull then Old_No_Event := 1;
    pour la partie insert je pense que j'avais déjà indiqué qu'une requête paramétrée serait plus propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FDConnection.ExecSQL('INSERT INTO EVENT(:I,CONVERT(DATE,GETDATE(),101),CONVERT(TIME,GETDATE()),:d,NULL,:A)',
                                         [old_No_Event,'Démarrage de l''API soft','ApiSoftMou']);
    n.b. pour ce qui est du CONVERT cela dépend du SGBD (MSSQL 2008 et + ) pour obtenir la date serveur GetDate (toujours MSSQL 2008 et +) de façon formattée
    ces convert peuvent bien sûr être remplacé par today et time mais cela depend également, bien évidemment de la structure de la table EVENT


    A l'inverse, si je peux faire toutes mes requêtes avec mon FDConnection, quels intérêts ont FDQuery et FDTable ?
    FdQuery et fdTable permettent d'avoir un ensemble de données. Les fdQuerys et fdtables envoient en fait des commandes sql.

    Comme il semble que tu travailles sur le monitoring sais-tu que cette fonctionnalité existe de base avec Firedac ?

    pour le timeout, je n'ai jamais essayé mais il y a http://docwiki.embarcadero.com/Libra...CmdExecTimeout

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Informatique Industrielle
    Inscrit en
    Février 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur Informatique Industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 25
    Par défaut
    je constate que ce que j'avais écrit dans ce post est resté lettre morte du moins en grande partie en ce qui concerne la connexion
    En effet non, vu que dans l'état actuel des choses ça fonctionne, je reste la dessus pour le moment. J'optimiserais quand j'aurais réglé tous mes problèmes.

    c'est pas tout à fait ça http://docwiki.embarcadero.com/Libra....ExecSQLScalar
    ExecSQLScalar renvoie la valeur de la première colonne dans la première ligne du premier ensemble de résultats.
    donc on peut très bien écrire un "select * from table" bien que cela soit
    Merci pour ce point, j'avais lu en travers et pas compris visiblement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Old_No_Event:=FDConnectionEvent.ExecSQLScalar('Select MAX(NO_EVENT)+1 From ' + Nom_tableEvent);
         if Old_No_Event.isNull then Old_No_Event := 1;
    Cardinal ne contient pas un membre nommé isNull (Old_no_Event est de type DWord)

    pour la partie insert je pense que j'avais déjà indiqué qu'une requête paramétrée serait plus propre
    En effet, et la requête paramétrée est à ce jour inconnue pour moi. (Pour le moment.) Mais je l'utiliserais au moment de l'optimisation de mon code aussi.
    Qu'es-ce qu'une requête paramétrée change par rapport à une requête standard ?

    n.b. pour ce qui est du CONVERT cela dépend du SGBD (MSSQL 2008 et + ) pour obtenir la date serveur GetDate (toujours MSSQL 2008 et +) de façon formattée
    ces convert peuvent bien sûr être remplacé par today et time mais cela depend également, bien évidemment de la structure de la table EVENT
    Je n'utilise pas convert et getdate pour la simple et bonne raison que mes formats dans mssql sont des char. Pourquoi ? C'est une conversion de base de donnée au format DBase vers mssql. Or, sur DBase, nous n'avions pas tous les formats que nous possédons maintenant.

    FdQuery et fdTable permettent d'avoir un ensemble de données. Les fdQuerys et fdtables envoient en fait des commandes sql.
    Elles envoient une requête. Si c'est un select, le résultat est stocké ou, dans quoi ?

    Comme il semble que tu travailles sur le monitoring sais-tu que cette fonctionnalité existe de base avec Firedac ?
    Il faut que tu m'aiguilles. Je ne comprend pas ou tu veux en venir.

    Merci. Cordialement.

    EDIT1 : Je viens de tester le CmdTimeOut, ça ne change rien à mon délai d'attente.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Re,
    pour corriger la partie isNull à laquelle je n'avais pas fait atttention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Old_No_Event : Cardinal;
    begin
    try Old_No_Event:=FDConnection1.ExecSQLScalar('Select MAX(ID)+1 From EVENTS');
    except
     Old_No_Event := 1;
    end;
    Qu'est-ce qu'une requête paramétrée change par rapport à une requête standard ?
    à part une codification plus propre sans risque de se tromper dans la concaténation de chaine : rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FDConnection.ExecSQL('INSERT INTO EVENT(:I,:d,:t,:d,NULL,:A)',
                                         [old_No_Event,
                                          formatdatetime('yyyy/mm/dd',today),
                                          TimeToStr(time),
                                          'Démarrage de l''API soft',
                                          'ApiSoftMou']);
    Je n'utilise pas convert et getdate pour la simple et bonne raison que mes formats dans mssql sont des char. Pourquoi ? C'est une conversion de base de donnée au format DBase vers mssql. Or, sur DBase, nous n'avions pas tous les formats que nous possédons maintenant.
    ok, mais l'utilisation des types date et time et même plutôt d'un TimeStamp seront nettement plus appropriés ensuite

    Si c'est un select, le résultat est stocké ou, dans quoi ?
    en mémoire dans un ensemble de données, autrement écrit : un Dataset tout comme le faisait TADOTable ou Query

    Il faut que tu m'aiguilles. Je ne comprend pas ou tu veux en venir.
    Oublie, le monitoring c'est pour les évènements sur la BDD

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur Informatique Industrielle
    Inscrit en
    Février 2017
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur Informatique Industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2017
    Messages : 25
    Par défaut
    Bonjour,

    pour corriger la partie isNull à laquelle je n'avais pas fait atttention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Old_No_Event : Cardinal;
    begin
    try Old_No_Event:=FDConnection1.ExecSQLScalar('Select MAX(ID)+1 From EVENTS');
    except
     Old_No_Event := 1;
    end;
    Impeccable.

    Qu'est-ce qu'une requête paramétrée change par rapport à une requête standard ?
    à part une codification plus propre sans risque de se tromper dans la concaténation de chaine : rien
    En réfléchissant un peu, j'arrive à comprendre l’intérêt de ce genre requête.
    Le problème c'est qu'en reprenant ton code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FDConnection.ExecSQL('INSERT INTO EVENT(:I,:d,:t,:d,NULL,:A)',
                                         [old_No_Event,
                                          formatdatetime('yyyy/mm/dd',today),
                                          TimeToStr(time),
                                          'Démarrage de l''API soft',
                                          'ApiSoftMou']);
    ça ne fonctionne pas. Par la même occasion, pourrais tu m'expliquer les ' :... '. J'aimerai savoir si la lettre située derrière a un intérêt, lequel et comment la choisir.

    ok, mais l'utilisation des types date et time et même plutôt d'un TimeStamp seront nettement plus appropriés ensuite
    Oui, ce sont des choses à reprendre par la suite.

    en mémoire dans un ensemble de données, autrement écrit : un Dataset tout comme le faisait TADOTable ou Query
    Le problème c'est que je procédais de la façon suivante : Je faisais un select * ( Je sais, c'est pas terrible). Ensuite, j'utilisais la fonction .last pour me mettre en fin de table. Enfin je récupérais la valeur désirée avec un .fields.fields. Je n'utilisais donc pas de dataset avant. (Peut-être une erreur de ma part) Dois-je en déclarer un pour pouvoir utiliser mes données ?

    Cordialement.

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par Pr3dators Voir le message
    Le problème c'est qu'en reprenant ton code,
    ça ne fonctionne pas. Par la même occasion, pourrais tu m'expliquer les ' :... '. J'aimerai savoir si la lettre située derrière a un intérêt, lequel et comment la choisir.
    pour les ":" , c'est une convention (datant de la vieille époque du BDE) pour indiquer qu'il s'agit d'un paramètre, la lettre suivante à un intérêt puisqu'elle permet d'indiquer le nom du paramètre (un nom de variable en quelque sorte). Je n'ai pas essayé en général je met toujours des noms différents, mais je me demande si un même nom (dans le cas du ExecSQL) ne fonctionnerai pas !

    si le INSERT ne fonctionne pas c'est qu'il doit y avoir une erreur , peut être à cause de l'apostrophe ou d'autre chose j'ai juste essayé de reprendre le code que tu avais écrit. Peut être aussi que des QuotedStr('Démarrage de l''API soft') et QuotedStr('ApiSoftMou') mais surtout parce que j'ai oublié VALUES

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FDConnection.ExecSQL('INSERT INTO EVENT VALUES (:I,:d,:t,:d,NULL,:A)',
                                         [old_No_Event,
                                          formatdatetime('yyyy/mm/dd',today),
                                          TimeToStr(time),
                                          'Démarrage de l''API soft',
                                          'ApiSoftMou']);
    Oui, ce sont des choses à reprendre par la suite.
    selon moi c'est indispensable
    Le problème c'est que je procédais de la façon suivante : Je faisais un select * ( Je sais, c'est pas terrible). Ensuite, j'utilisais la fonction .last pour me mettre en fin de table. Enfin je récupérais la valeur désirée avec un .fields.fields. Je n'utilisais donc pas de dataset avant. (Peut-être une erreur de ma part) Dois-je en déclarer un pour pouvoir utiliser mes données ?
    non, pas dans ce bout de code. De plus je ne parlais pas d'un composant TDataset utile en VCL lorsque l'on veut faire des relations entre la BDD et des composants, mais bien d'un dataset soit, traduit : un ensemble de données

Discussions similaires

  1. Comparaison Table Excel table Mssql
    Par k-lendos dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 01/06/2005, 14h56
  2. [MSSQL][debutant]
    Par calvin dans le forum Hibernate
    Réponses: 6
    Dernier message: 13/05/2004, 12h03
  3. Autoincrément, MSSQL et dbExpress
    Par Ethmane dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/02/2004, 13h33
  4. insérer une date dans une table mssql
    Par ericmart dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/01/2004, 10h37
  5. connection a mssql a partir d'une page php
    Par jean_marc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/11/2003, 14h24

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