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 :

ADO + Données en cache


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut ADO + Données en cache
    Bonjour à tous,

    Moi qui suit habitué au modèle TDbGrid <-> TDataSource <-> TQuery <-> TUpdateSQL et notamment la propriété "CacheUpdates" du TQuery.... Là je suis un peu perdu.

    Je m'explique, ne souhaitant plus utilisé l'ODBC pour la connexion à la base de données, je me suis orienté vers les objets TADO... Mais me voilà confronté à un souci.
    Les modifications que j'apporte dans mon TDbGrid ne sont absolument pas conservés dès lors que je change d'enregistrement.
    Sachant que cette fois-ci, j'utilise : TDbGrid <-> TDataSource <-> TADOQUery (-----> TADOConnection) et que j'ai, à peu près, laisser les propriétés par défaut... Ne sachant trop à quoi elles servent toutes pour le moment.

    Après, quelques recherches sans succès, me voilà donc ici à vous demande un petit coup de main !

    Pour info: J'utilise Delphi 2009 et le SGBD est MS SQL 2008 R2.

    Amicalement,

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Personne ? Up

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    pour répondre à ce UP (plus ou moins inopportun )
    Citation Envoyé par anthony.cortez Voir le message
    Je m'explique, ne souhaitant plus utilisé l'ODBC pour la connexion à la base de données
    Enlever une couche, ça se comprend
    je me suis orienté vers les objets TADO
    pour en remettre une autre, ça se comprend moins (en tout cas , c'est pas ce que j'aurais choisi)
    Les modifications que j'apporte dans mon TDbGrid ne sont absolument pas conservés dès lors que je change d'enregistrement.
    piste principale , il manque un ApplyUpdate (il me semble qu'avec ADO on parle de UpdateBatch) ou Post quelque part
    à vérifier dans la doc , je ne suis pas assez calé ADO
    Sachant que cette fois-ci, j'utilise : TDbGrid <-> TDataSource <-> TADOQUery (-----> TADOConnection) et que j'ai, à peu près, laisser les propriétés par défaut...
    le Isolationlevel serait quand même un renseignement +
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Citation Envoyé par SergioMaster Voir le message
    pour répondre à ce UP (plus ou moins inopportun )
    Je ne voulais pas être désagréable, ni même donner l'impression d'être impatient.

    Citation Envoyé par SergioMaster Voir le message
    Enlever une couche, ça se comprend

    pour en remettre une autre, ça se comprend moins (en tout cas , c'est pas ce que j'aurais choisi)
    Effectivement, je souhaite me débarrasser de la bouche ODBC. L'ADO me semblait (à tort visiblement) être la solution pour une connexion native (Poste <-> Serveur SQL).

    Citation Envoyé par SergioMaster Voir le message
    piste principale , il manque un ApplyUpdate (il me semble qu'avec ADO on parle de UpdateBatch) ou Post quelque part
    à vérifier dans la doc , je ne suis pas assez calé ADO
    C'est ce que j'ai cru comprendre aussi, je n'ai pas encore trouvé le bon fonctionnement. Je reviendrai avec la solution.
    Ceci dit, je ne souhaite, en aucun cas, ajouter une couche supplémentaire.

    Merci pour ta réponse,

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    En fait,

    J'ai beau mettre (comme vu sur la toile ou la doc.) les propriétés CursorType à ctKeyset et LockType à ltBatchOptimistic... Cela ne change en rien mon problème.

    Quand je modifie une valeur dans mon DBGrid, je ne veux pas qu'elle se répercute directement en base de données... C'est l'utilisateur qui devra enregistrer pour que cela se fasse (d'ailleurs, dans mon cas, je devrais boucler sur MonADOQuery pour enregistrer toutes les lignes).

    Mais dès que je change d'enregistrement (passage ligne 1 à 2 par exemple), la valeur s'efface systématiquement. Et je ne comprends vraiment pas comment utiliser l'UpdateBatch.

    J'ai un TDBGrid, un TDataSource, un TADOConnection et un TADOQuery.

    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
     
    // cette liaison est faite directement depuis la conception
    MonDBGrid.DataSource := MonDataSource;
    MonDataSource.DataSet := MonADOQuery;
     
    // les propriétés de MonADOQuery
    MonADOQuery.CorsorLocation := clUseClient;
    MonADOQuery.CursorType := ctKeyset;
    MonADOQuery.LockType := ltBatchOptimistic;
     
    // connexion à ma BDD
    MonADOConnection.LoginPrompt := False;
    MonADOConnection.ConnectionString := 'Provider=SQLOLEDB.1;' +
                                 'Persist Security Info=False;' +
                                 'User ID=' + UserBase + ';' +
                                 'Password=' + PassWordBase + ';' +
                                 'Initial Catalog=' + NomBase + ';' +
                                 'Data Source=' + NomServer + ';';
    MonADOConnection.Connected := True;
    MonADOQuery.Connection := MonADOConnection;
     
    // ...
     
    with MonADOQuery do
    begin
        SQL.Clear;
        SQL.Add('SELECT CHAMP1, CHAMP2, ...... blablabla');
        SQL.Add('FROM TABLE1 INNER JOIN TABLE 2 ON .....');
        SQL.Add('WHERE TABLE1.CHAMP2 = :MA_VALEUR');
        Parameters.ParamByName('MA_VALEUR').Value := valeur;
        try
            Active := True;
            Edit; 
        except
            Active := False;
            SQL.Clear;
        end;
    end;

    C'est à peu près tout pour le moment.... Mes fields sont créés et rattachés aux colonnes de ma grille... En gros à part ce problème de données en Update, tout est ok.

    Si à partir de ça quelqu'un saurait me dire si, déjà, je fais quelque chose de mal, cela serait bien évidemment très sympa.

    Salutations,

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par anthony.cortez Voir le message
    J'ai beau mettre (comme vu sur la toile ou la doc.) les propriétés CursorType à ctKeyset et LockType à ltBatchOptimistic... Cela ne change en rien mon problème.
    Si vous mettez autre chose que ltBatchOptimistic, tous les saisies et modifications seront répercutées au serveur immédiatement.

    Citation Envoyé par anthony.cortez Voir le message
    Quand je modifie une valeur dans mon DBGrid, je ne veux pas qu'elle se répercute directement en base de données... C'est l'utilisateur qui devra enregistrer pour que cela se fasse (d'ailleurs, dans mon cas, je devrais boucler sur MonADOQuery pour enregistrer toutes les lignes).
    uhhh ??? Je ne comprends pas la phrase entre parenthèses...

    Citation Envoyé par anthony.cortez Voir le message
    Mais dès que je change d'enregistrement (passage ligne 1 à 2 par exemple), la valeur s'efface systématiquement. Et je ne comprends vraiment pas comment utiliser l'UpdateBatch.
    Après validation par l'utilisateur, il faut appeler la commande UpdateBatch, par exemple comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try
      MonADOConnection.BeginTrans;
      MonADOQuery.UpdateBatch;
      MonADOConnection.CommitTrans;
    except
      MonADOConnection.RollbackTrans;
    end;

    Citation Envoyé par anthony.cortez Voir le message
    J'ai un TDBGrid, un TDataSource, un TADOConnection et un TADOQuery.

    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
    with MonADOQuery do
    begin
        SQL.Clear;
        SQL.Add('SELECT CHAMP1, CHAMP2, ...... blablabla');
        SQL.Add('FROM TABLE1 INNER JOIN TABLE 2 ON .....');
        SQL.Add('WHERE TABLE1.CHAMP2 = :MA_VALEUR');
        Parameters.ParamByName('MA_VALEUR').Value := valeur;
        try
            Active := True;
            Edit;  /// POURQUOI ????
        except
            Active := False;
            SQL.Clear;
        end;
    end;

    C'est à peu près tout pour le moment.... Mes fields sont créés et rattachés aux colonnes de ma grille... En gros à part ce problème de données en Update, tout est ok.

    Si à partir de ça quelqu'un saurait me dire si, déjà, je fais quelque chose de mal, cela serait bien évidemment très sympa.
    Pourquoi passer la 1° ligne de l'ensemble de donnée en mode édition après ouverture ? La saisie dans un DBEdit ou dans la grille le fera implicitement...

    Enfin, pour les mises à jour différés, il existe une alternative :
    TDBGrid <-> TDataSource <-> TClientDataSet <-> TDataSetProvider <-> TADOQuery <-> TADOConnection.
    Philippe.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Après votre message, j'ai appliqué l'aide et je m'en suis sorti. Cette fois-ci, mes données sont bien conservées en mémoire SAUF .... 2 colonnes.

    Alors je tente de m'expliquer, j'ai ma requête qui se présente comme suit :

    SELECT TEST=0, T1.CHAMP1, T1.CHAMP, T2.CHAMP1, ....
    FROM .....
    WHERE....

    Les modifications effectuées dans mon DBGrid sur les colonnes liées aux champs CHAMP1, CHAMP2 sont bien conservées (je le vois notamment après un déplacement sur une autre ligne du tableau) - changement d'enregistrement.
    Cependant, si je modifie la colonne liée au champ TEST, champ de type Integer, (je saisie 3 par exemple) la valeur est remise à 0 dès que je change d'enregistrement.

    Est-ce liée au fait que dans ma requête, la valeur du champ ne soit pas issue d'une colonne mais d'une valeur mise par défaut ?
    SELECT TEST=0
    En tout cas, cela m'a déjà très bien aidé et je vous en remercie.

    Concernant la possibilité d'utiliser le TClientDataSet et le TDataSetProvider .. Ne sachant pas trop les utiliser, je ferai sans pour le moment, simplement par manque de temps.

    Merci beaucoup

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Faut-il déclarer ces fields non reliés à des champs de BDD dans un type spécial ? Parce que quoiqu'il arrive, il me laisse la valeur à 0 .... Ce problème n'existe pas avec les composants BDE.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Bonjour à tous,

    Désolé pour le double post mais je reviens sur le sujet afin de savoir si quelqu'un aurait une idée de la manière dont il faut procéder pour mes Fields qui ne sont pas liés aux champs d'une table?

    Je m'excuse, à nouveau, et vous souhaite une très bonne journée.

Discussions similaires

  1. Applet, rafraichissement données et cache
    Par MustOne dans le forum Applets
    Réponses: 5
    Dernier message: 20/06/2014, 12h14
  2. Réponses: 9
    Dernier message: 18/06/2008, 15h26
  3. Réponses: 1
    Dernier message: 19/06/2007, 11h56
  4. Fenêtre base de données à moitié cachée
    Par Tententai dans le forum IHM
    Réponses: 2
    Dernier message: 09/12/2005, 11h06
  5. [Conception] Cache base de donnée Versus cache FTP ?
    Par genova dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/09/2005, 18h39

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