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

C++Builder Discussion :

[debutant] open, close et batchmove sur un composant TTable


Sujet :

C++Builder

  1. #1
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut [debutant] open, close et batchmove sur un composant TTable
    bonjour,

    J'ai une TTable nommée TableTemporaire, je la remplis grâce à la méthode BatchMove() qui a comme paramètre le résultat d'une requête SQL et l'attribut batCopy.
    Querytempo est un composant TQuery. Quoi qu'il arrive les données de cette base sont écrasées lors de chaque requête.

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TableTemporaire->Open();
    TableTemporaire->BatchMove(Querytempo,batCopy);
    TableTemporaire->Close();
    Le code ci-dessus fonctionne très bien si le fichier DB est présent sur le disque dur. Par contre si mon fichier n'existe pas le programme plante car il ne trouve pas mon fichier DB.


    J'ai cependant constaté que ce code (sans la méthode open())
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TableTemporaire->BatchMove(Querytempo,batCopy);
    TableTemporaire->Close();
    fonctionne très bien que ma base de données existe ou non.... Si mon fichier DB n'existe pas il est créé sur le disque lors du BatchMove().

    D'où ces questions :
    • est-ce que je peux me passer de la méthode open() ? Car visiblement Batchmove() créé mon fichier DB s'il n'existe pas ou l'ouvre s'il existe.
    • est-ce que ce code :
      Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
       
      if (TableTemporaire->Exists)
      	        TableTemporaire->Open();
      TableTemporaire->BatchMove(Querytempo,batCopy);
      TableTemporaire->Close();
      est un bon compromis finalement ?
    • quel est le rôle de la méthode open() dans ce cas là ?

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Nopain m'apporte une solution

    Citation Envoyé par Nopain
    Si la table destination n'existe pas, crée la puis utilise BatchMove de cette meme table avec le mode Append pour faire la copie.

    Si la table existe deja, utilise son BatchMove avec le mode Copy.

    Voila, j'espere que cela fera avancer les choses!
    or ma table temporaire est une table dont le contenu (champs et valeurs) varie, donc finalement, est-ce que ce code :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (TableTemporaire->Exists)
    	        TableTemporaire->Open();
    TableTemporaire->BatchMove(Querytempo,batCopy);
    TableTemporaire->Close();
    un peu "bourrin" n'est pas un bon compromis ? (la table est dans ce cas réinitiliasée au niveau des champs et des valeurs).

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 40
    Par défaut
    Citation Envoyé par Auteur
    est-ce que je peux me passer de la méthode open() ? Car visiblement Batchmove() créé mon fichier DB s'il n'existe pas ou l'ouvre s'il existe.
    Ce qui va suivre pourrait expliquer cela:

    Il s'agit d'un extrait du fichier "DBTables.pas", je t'invite a consulter son equivalent pour C++Builder pour voir ce qui s'y passe:

    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
     
    procedure TBatchMove.Execute;
    ...
     
    if BatchMode = batCopy then
        begin
          Destination.Close;
    	...
          Destination.IndexDefs.Clear;
          Destination.CreateTable;
          BatchMode := batAppend;
        end;
     
        Destination.Open;
    ...
    Le mode batCopy de BatchMove ne prete aucun interet au fait que le dataset destination existe ou pas... Attention tout de meme, les autres modes exigent l'existence de destination!


    Citation Envoyé par Auteur
    est-ce que ce code :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (TableTemporaire->Exists)
    	        TableTemporaire->Open();
    TableTemporaire->BatchMove(Querytempo,batCopy);
    TableTemporaire->Close();
    est un bon compromis finalement ?
    Ton code est tout a fait correct bien sûr mais... comme on l'a vu, cette verification est deja incluse dans le BatchMove.



    Citation Envoyé par Auteur
    quel est le rôle de la méthode open() dans ce cas là ?
    La methode Open (comme son l'indique) ouvre un Dataset existant - Autrement c'est une erreur garantie!

    BatchMove ouvre le dataset destination avec tous les modes en fait... Donc rien ne sert de faire un Open avant d'invoquer BatchMove.


    Voila.

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Merci Nopain pour cet éclaircissement

    Le code pascal montre très bien ce qui se passe dans le cas de batCopy.
    La table est vidée et recrée lors du batCopy. Comme tu le dis, la vérification est faite dans ce cas et la méthode open() est sous entendue.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/11/2013, 20h31
  2. Réponses: 2
    Dernier message: 28/02/2011, 21h33
  3. problème sur le composant aspSmartUpload
    Par PrinceMaster77 dans le forum ASP
    Réponses: 8
    Dernier message: 23/09/2004, 10h17
  4. [C#] OnPaint(PaintEventArgs e) sur création Composant
    Par pc152 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/08/2004, 16h13
  5. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 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