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 :

Transferer une table de SQL Server vers Access


Sujet :

Bases de données Delphi

  1. #1
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut Transferer une table de SQL Server vers Access
    Bonjour

    Ca fait des mois que j'essaye de trouver une solution a mon problème mais rien n'y fait

    Dans mon programme je transfert une table d'Access vers SQL server pour effectuer des traitements puis je retransfert vers Access à la fin.

    Pour envoyer ma table sur SQL Server, aucun problème.
    Par contre dans l'autre sens, dès que la table est assez grosse ca ne va plus du tout. Soit il ne transfert pas toute les lignes sans message d'erreur, soit il me met en plein milieu "Ressource limite de la table temporaire".

    J'ai essayé avec un Batchmove, plusieurs batchmoves en faisant par morceaux et avec le code suivant mais rien n'y fait.

    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
          TTabOrig.TableName := NomTable+'ADR';
          TTabTrav.TableName := 'tabtrav'+NomTable;
          with BatchMove2 do
          begin
               Execute;
          end;
          TTabOrig.open;
          TTabOrig.Delete;
          TTabTrav.open;
          TTabTrav.prior;
          for j:=1 to TTabTrav.RecordCount do
          begin
               Application.ProcessMessages;
               TTabOrig.Insert;
               for k:=0 to TTabTrav.FieldCount-1 do
               begin
                    TTabOrig.fields.Fields[k] := TTabTrav.fields.Fields[k];
               end;
               TTabOrig.post;
               TTabtrav.Next;
          end;
          TTabOrig.close;
    Là je ne vois vraiment plus comment faire.
    Quelqu'un connaitrait une autre méthode ?

    Merci

    PS : je suis sous D5 et j'utilise BDE

  2. #2
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    personne n'a d'idée à ce sujet ?
    je veux bien essayer tout et n'importe quoi vu où j'en suis

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    salut,

    pourais tu nous indiquer la taille de cette table ? (TTabTrav.RecordCoun=?)


    (une remarque sur le code que t'as posté : evites d'effectuer un Post à chaque insertion, ça fait ralentir grave ton traitement)

  4. #4
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    la taille est variable mais celle sur laquelle je teste fais 250000 enregistrements.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    250000 c'est jouable pour une base Acces. meme que j'ai eu a faire a peu pres le meme traitement.

    mais bon, dans ce type de probleme je procéde comme suit :

    1- j'utiliserais les composant ADO il sont plus stable que le bon vieux BDE.
    2- je decompose le traitement en pti traitements isolés dans des transaction (StartTransaction => CommitTransaction)

    3- je programmerais deux routine :
    A- ViderTable Origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fonction ViderTable:Boolean;
    debut
      try
        StartTransaction;
        LancerCommand ("Delete From TableOrigine");
        Commit;
        Result:=True;
      except
         Rollback
         Result:=False;
      end;
    Fin
    B- Copier un bout de ma table :
    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
    fonction CopierUnBout(StartRecord, Count:Integer):Boolean;
    debut
      StartTransaction;  
      try  
        Alleràl'enregistrement(StartRecord, TabTrav);
        boucler Count fois 
          copier l'enregistrement
        Post;
        Commit;
        Result:=True;
      except  
         Rollback
         Result:=False;
      end;
    fin
    4- pour la copie integrale de la table je ferais une routine qui utilise les deux routine precedentes avec une strategie de reprise sur erreur, avec un fichier log qui va me rendre compte sur deroulement des traitements

    // bon, ce n'est qu'un point de vue (d'un petit chebreg qui vien des fin fond du bled ), si tu veux essayer cette methode il te reste quelques ajustements a faire

  6. #6
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    j'ai déjà essayé de traiter par morceaux mais ca ne fonctionnait pas non plus
    Par contre je peux essayer de faire le post juste à la fin pour voir si ca lui plait mieux.

  7. #7
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    j'ai essayé en mettant le post après la boucle mais ca ne marche pas plus, j'ai toujours "dépassement de table temporaire".

    J'ai essayé en passant par un fichier texte intermédiaire à l'aide d'une fonction trouvée dans la FAQ. Ca marche pour 250000 mais pas pour 350000 enregistrements. Ca se plante toujours avec le même message au mileu de la fonction de la FAQ.

    Je n'ai pas essayé avec ADO car ca me demanderai beaucoup de modifs.

    Sinon je pensais faire ca avec un DTS (quand je le fais à la main ca fonctionne très bien et c'est 100 fois plus rapide) mais je ne sais pas comment l'automatiser en Delphi. J'ai cherché sur google mais j'ai rien trouvé. Quelqu'un saurait comment faire ?

  8. #8
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    j'ai essayé en mettant le post après la boucle mais ca ne marche pas plus, j'ai toujours "dépassement de table temporaire".
    le Post c'est pour accelerer le traitement en evitant de poster à chaque fois, c'est tout.

    Sinon je pensais faire ca avec un DTS (quand je le fais à la main ca fonctionne très bien et c'est 100 fois plus rapide) mais je ne sais pas comment l'automatiser en Delphi.
    c'est quoi DTS ?

  9. #9
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    Data Transformation Services

    c'est un outil de SQL Server qui permet de transferer des tables d'une base à une autre notemment et on peut le faire entre SQL Server et Access. Le soucis c'est que je ne veux pas faire apparaitre l'interface, que tout ce fasse automatiquement suivant les variables que j'ai dans mon programmes mais je ne sais pas comment faire

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 35
    Points
    35
    Par défaut
    je ne connais pas bien access
    mais une commande du genre

    INSERT INTO ta_table_origine
    SELECT *
    FROM ta_table_travail
    ne conviendrait il pas ?

  11. #11
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    je ne pense pas puisque c'est sur 2 SGBD différents

  12. #12
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    pithier a raison, si tu travail avec BDE une requete multi bases est possible
    c'est bien expliqué dans ce chapitre du livre d'Olivier Dahan et Paul Toth (URL http://www.eyrolles.com/Chapitres/9782212111439/09.pdf)

  13. #13
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    ok mais comment faire ?
    aurais-tu un lien ou un exemple à me donner ?

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 35
    Points
    35
    Par défaut
    regarde là dans sqlpro de Frédéric BROUARD
    http://sqlpro.developpez.com/cours/sqlaz/jointures/

    dans la partie : 3.4. La jointure hétérogène

  15. #15
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    ok merci, je vais tester

  16. #16
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    Je viens de tester et j'ai un message d'erreur SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          Qtabtrav.close;
          QTabtrav.sql.Clear;
          QTabtrav.sql.Add('select * into ":accessadr01:'+NomTable+'ADR" from ":mediapost:tabtrav'+NomTable+'"');
          QTabtrav.prepare;
          QTabtrav.ExecSQL;
    QTabTrav est un TQuery connecté à ma base SQL Server.
    accessadr01 est l'alias de ma base Access, mediapost est l'alias de ma base SQL Server.

    Quelqu'un sait comment faire ?

  17. #17
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Oluha
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QTabtrav.sql.Add('select * into ":accessadr01:'+NomTable+'ADR" from ":mediapost:tabtrav'+NomTable+'"');
    j'aurais plutôt vu quelque chose comme :
    tu insert dans ta base access des données que tu selectes dans ta base sqlserver , à moins qu'Access soit un produit spécial (d'ailleurs à mon avis ce serait mieux de tout faire sous SqlServer et de jeter Access , sauf contraintes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QTabtrav.sql.Add('Insert into ":accessadr01:'+NomTable+'ADR" 
     (select * from ":mediapost:tabtrav'+NomTable+'"'));

  18. #18
    Membre chevronné Avatar de Oluha
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 183
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 183
    Points : 1 967
    Points
    1 967
    Par défaut
    j'ai aussi essayé ca mais ca ne fonctionne pas plus

    d'ailleurs à mon avis ce serait mieux de tout faire sous SqlServer et de jeter Access Laughing , sauf contraintes
    si j'avais eu le choix c'est ce que j'aurais fais mais les clients envoient des fichiers Access et il faut leur rendre dans ce format aussi. Ceux qui utilisent le logiciel à l'exploitation, faut pas trop leur en demander, tout doit être automatique.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 32
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Oluha
    j'ai aussi essayé ca mais ca ne fonctionne pas plus
    quel est le message d'erreur , as-tu essayé en mettant le nom d'une table en dur ?

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. [Toutes versions] Lier une table de SQL server à Access dans Access
    Par Traknoz dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/01/2011, 00h36
  3. Réponses: 3
    Dernier message: 15/10/2008, 09h24
  4. Script sql pour exporter BD de sql server vers access
    Par kayser dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/12/2004, 15h48
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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