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 :

Copier une base vers une autre avec les composants IBX


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Points : 297
    Points
    297
    Par défaut Copier une base vers une autre avec les composants IBX
    bonsoir ,
    je suis entrain de réalisé un petit utilitaire qui copie une base vers une autre.
    on utilisant les composants IBX du delphi 7
    base de donnée Interbase 7.5


    voici les propriétés du composant IBDatabase1 qui pointe vers la base source .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Name :  Source
    default Transaction :   IBTransactionSource

    les propriétés du composant IBTransactionSource sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefaultAction : TACommit
    DefaultDatabase : Source
    Params : read_committed
             rec_version
             nowait

    voici les propriétés du composant IBDatabase2 qui pointe vers la base Destination
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Name :  Destination
    default Transaction :   IBTransactionDestination
    les propriétés du composant IBTransactionDestination sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefaultAction : TACommit
    DefaultDatabase : Destination
    Params : read_committed
             rec_version
             nowait


    je tente de copie les données table par table c'est pour ça j'utilise deux composants IBTable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IBTable1 (de la source)
    Name : AncienTable :
    DataBase : Source
    Transaction : IBTransactionSource

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IBTable2 (de la Destinatio
    Name : NouvelleTable :
    DataBase : Destination
    cette nouvelle table a son propre transaction qui est
    Transaction : IBTransaction2

    les propriétés du composant IBTransaction2 sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DefaultAction : TACommit
    DefaultDatabase : Source
    Params : read_committed
             rec_version
             nowait

    pour la copie j'utilise ce bout de 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
    45
    46
    47
    48
    49
    50
               //1- Ouvrir la base source
                 Source.Close;
                 Source.Open;
     
              //4- Ouvrir la nouvelle base
                Destination.Close;
                Destination.Open ;
                if  not IBTransactionDestination.InTransaction then
                   IBTransactionDestination.StartTransaction ;
     
     
     
                 Source.GetTableNames(ListdesTable.Items); // pour a voir la liste des tables
     
                 NumeroTable :=  0 ;
                 while NumeroTable <= ListdesTable.Count - 1 do
                 begin
     
                        AncienTable.Close ;
                        NouvelleTable.Close ;
                        AncienTable.TableName := ListdesTable.Items[NumeroTable] ;
     
     
                           if  not IBTransaction2.InTransaction then
                              IBTransaction2.StartTransaction ;
                            AncienTable.Open ;
                            if AncienTable.IsEmpty = False then
                            begin
                               NouvelleTable.TableName := ListdesTable.Items[NumeroTable] ;
     
                               NouvelleTable.Open ;
                               NbColonne := AncienTable.FieldCount ;
     
                               While not AncienTable.Eof do
                               begin
                                  NouvelleTable.Insert ;
                                  for MonIndice := 0  to NbColonne -1 do
                                  begin
                                     NouvelleTable.Fields[MonIndice].AsString :=  AncienTable.Fields[MonIndice].AsString ;
     
                                  end;
                                  NouvelleTable.Post ;
                                  AncienTable.Next ;
                               end;
                               IBTransaction2.Commit ;
     
                            end;
     
                     NumeroTable := NumeroTable + 1
                 end;
    mais tellement il y a des tables qui contiennent plus de 180000 enregistrements j'ai message d'erreur qui est le suivant :
    mémoire insuffisante.

    je sais très bien qu'il y a une mauvaise manipulation des transactions mais je ne sais pas ou?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    Tout d'abord, si la copie d'enregistrement doit se faire de cette manière (while not tablesource.eof do .... next end) il serait bon de valider la transaction tout les 100 à 200 enregistrements. Donc dans ce qui est proposé : rajouter un compteur

    une autre solution pourrait être d'utiliser des fichiers externes (manuel Datas Definitions page 97)

  3. #3
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Points : 297
    Points
    297
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    Tout d'abord, si la copie d'enregistrement doit se faire de cette manière (while not tablesource.eof do .... next end) il serait bon de valider la transaction tout les 100 à 200 enregistrements. Donc dans ce qui est proposé : rajouter un compteur

    une autre solution pourrait être d'utiliser des fichiers externes (manuel Datas Definitions page 97)
    Bonjour Sergio et Merci pour la répense .
    pour la validation des enregistrements tous les 200 enregistrements ça ne marche pas bien , j'ai toujours le meme message d'erreur .

    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
               //1- Ouvrir la base source
                 Source.Close;
                 Source.Open;
     
              //4- Ouvrir la nouvelle base
                Destination.Close;
                Destination.Open ;
                if  not IBTransactionDestination.InTransaction then
                   IBTransactionDestination.StartTransaction ;
     
     
     
                 Source.GetTableNames(ListdesTable.Items); // pour a voir la liste des tables
     
                 NumeroTable :=  0 ;
                 while NumeroTable <= ListdesTable.Count - 1 do
                 begin
     
                        AncienTable.Close ;
                        NouvelleTable.Close ;
                        AncienTable.TableName := ListdesTable.Items[NumeroTable] ;
     
     
                           if  not IBTransaction2.InTransaction then
                              IBTransaction2.StartTransaction ;
                            AncienTable.Open ;
                            if AncienTable.IsEmpty = False then
                            begin
                               NouvelleTable.TableName := ListdesTable.Items[NumeroTable] ;
     
                               NouvelleTable.Open ;
                               NbColonne := AncienTable.FieldCount ;
                               i := 0 ; // compteur de nombre d'enregistrement
                               While not AncienTable.Eof do
                               begin
                                  NouvelleTable.Insert ;
                                  for MonIndice := 0  to NbColonne -1 do
                                  begin
                                     NouvelleTable.Fields[MonIndice].AsString :=  AncienTable.Fields[MonIndice].AsString ;
     
                                  end;
                                  NouvelleTable.Post ;
                                  i := i + 1 ;
                                  if (i mod 200) = 0 then
                                  begin
                                   IBTransaction2.Commit ;
                                   NouvelleTable.open ;
    
                                  end ;
    
                                  AncienTable.Next ;
                               end;
                               
     
                            end;
     
                     NumeroTable := NumeroTable + 1
                 end;

    pour le fichier externe je vais jeter un coup d'oeil.
    remarque :
    1- je ne peut pas faire un backup sur la base source , puis restaure sur la base destination , car cette dernière contient d'autre table .
    2- j'ai essayer de faire cette opération on utilisant IBconsol , en exportant les enregistrement des tables de la base source vers un ficher .IBX , puis l'importer sur les tables de la base destination. mais je souhaite faire tous ça par programmation.

    SVP, Sergion , est ce que ma logique de manipulation des transaction et correcte ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    re, réponses rapides car je n'ai pas trop de temps

    le nouvelletable.open est/devrait être inutile ligne 47 quoique avec IBX.....
    je ne suis pas sur que les derniers enregistrements soient copiés, il doit manquer un if IBTransaction2.InTransaction then IBTransaction2.Commit ; après la fin de boucle (ligne 53)

    ligne 39 il vaudrait mieux passer par Value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NouvelleTable.Fields[MonIndice].Value :=  AncienTable.Fields[MonIndice].Value ;
    comme je l'ai déjà dit je ne suis pas un expert IBxxxxx

  5. #5
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Points : 297
    Points
    297
    Par défaut
    Bonjour,
    j'ai fait tous ce que tu m'a dit mais toujours le même problème.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    moi non plus je ne connais/n'utilise pas ces composants

    Mais quand une transaction est "validée" (Commit/ rollback), elle se ferme...

    il faut donc réactiver la transaction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       i := i + 1 ;
                                  if (i mod 200) = 0 then
                                  begin
                                   IBTransaction2.Commit ;
                                   NouvelleTable.open ;
                                   if  not IBTransactionDestination.InTransaction then
                                       IBTransactionDestination.StartTransaction ;
     
                                  end ;

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bon, j'ai fait un test rapide voilà une solution qui fonctionne

    reste à ajouter les boucles sur les tables et sur les champs
    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    var n : Integer;
    begin
    Source.Connected:=True;
    Destination.Connected:=True;
    TableSource.Active:=True;
    IBTransaction2.StartTransaction;
    TableDest.CachedUpdates:=True;
    TableDest.Active:=True;
    n:=0;
    while not TableSource.Eof do
     begin
       TableDest.Insert;
       TableDest.Fields[0].Value:=TableSource.Fields[0].Value;
       TableDest.Fields[1].Value:=TableSource.Fields[1].Value;
       inc(n);
       TableDest.Post;
       if (n=33) then
         begin
           TableDest.ApplyUpdates;
           IBTransaction2.Commit;
           n:=0;
           IBTransaction2.StartTransaction;
           TableDest.Active:=True;
         end;
       TableSource.Next;
     end;
     // vérifier s'il y en a
     if TableDest.UpdatesPending then
      begin
       TableDest.ApplyUpdates;
       IBTransaction2.Commit;
      end;
     TableSource.Close;
     Destination.Connected:=False;
     Source.Connected:=False;
    end;
    en faisant mes recherches dans l'aide de Delphi j'ai également vu ceci [edit] changement de poste

    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
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      Filename : String;
      RawOutput : TIBOutputRawFile;
      RawInput : TIBInputRawFile;
    begin
      IBSQL1.Sql.Text := 'Select firstname, lastname from people';
      IBSQL2.Sql.Text := 'Insert into people (firstname, lastname) values
    (:first, :last)';
      Filename := 'DataFile.RAW';
      RawOutput:= TIBOutputRawFile.Create;
      try
        RawOutput.FileName := FileName;
        IBSQL1.BatchOutput(RawOutput);
      finally
        RawOutput.Free;
      end;
     
      RawInput := TIBInputRawFile.Create;
      try
        RawInput.FileName := FileName;
        IBSQL2.BatchInput(RawInput);
      finally
        RawInput.Free;
      end;
      IBSQL2.Transaction.CommitRetaining;
    end;

  8. #8
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Points : 297
    Points
    297
    Par défaut
    bonsoir tous le monde ,
    toujours le même problème .

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    pour avoir tester le code que j'ai fourni (du moins sur une table et seulement quelques champs de cette dernière)
    je sais que ce dernier fonctionne

    reste que je ne maitrise pas les IBxxxxx jamais utilisés avant.

    Donc ma question serait : est-ce que tu peux essayer un code identique (copie d'une seule table, et de quelques champs seulement) pour vérifier qu'il ne s'agirait pas d'une propriété quelconque différente entre mon test et ton programme

  10. #10
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 407
    Points : 297
    Points
    297
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    en faisant mes recherches dans l'aide de Delphi j'ai également vu ceci [edit] changement de poste

    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
    procedure TForm1.Button1Click(Sender: TObject);
     
    var
      Filename : String;
      RawOutput : TIBOutputRawFile;
      RawInput : TIBInputRawFile;
    begin
      IBSQL1.Sql.Text := 'Select firstname, lastname from people';
      IBSQL2.Sql.Text := 'Insert into people (firstname, lastname) values
    (:first, :last)';
      Filename := 'DataFile.RAW';
      RawOutput:= TIBOutputRawFile.Create;
      try
        RawOutput.FileName := FileName;
        IBSQL1.BatchOutput(RawOutput);
      finally
        RawOutput.Free;
      end;
     
      RawInput := TIBInputRawFile.Create;
      try
        RawInput.FileName := FileName;
        IBSQL2.BatchInput(RawInput);
      finally
        RawInput.Free;
      end;
      IBSQL2.Transaction.CommitRetaining;
    end;

    j'ai bien tester ce bout de code , ça marche très très très bien.
    j'ai pu transféré plus de 370 000 enregistrement par table , dans un temps minimal.
    Merci beaucoup Sergio vous êtes vraiment un Grand patron .

    je vais tester une autre méthode qui est externel file , et je reviens mon patron.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bonjour,
    Citation Envoyé par aimer_Delphi Voir le message
    Merci beaucoup Sergio vous êtes vraiment un Grand patron
    non, j'ai simplement bien lu l'aide Delphi 7 sur les IBxxxxxx, et du temps de D7 l'aide était très très bien faite (sans oublier qu'on avait aussi l'aide papier), la "complexification/amélioration" de Delphi ainsi qu'un sens pratique (cout de la documentation papier) à fait que l'aide papier est devenue rare, et que l'on a encore beaucoup trop de "aucune aide n'est disponible pour l'instant".

    La personne qui transformera l'aide Delphi 7 (hlp) au nouveau format afin que l'on ai plus besoin d'avoir à faire d'installation du winhelp32 sur les nouveaux OS aura droit à une mousse de ma part, cette aide est un incontournable (rapide, complète ou peu s'en faut à l'époque)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 183
    Points : 62
    Points
    62
    Par défaut
    Bonjour Sergio,

    Je cherche à passer mes tables Paradox 7 en FireBird 3, il n'existe pas d'utilitaire pour ça ?

    Aussi, j'ai téléchargé Delphi 10 Seattle pour tester, je n'arrive pas à installer ZeosLib (erreurs de compilation).

    Merci pour ton aide

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    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 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par fveto Voir le message
    Bonjour Sergio,

    Je cherche à passer mes tables Paradox 7 en FireBird 3, il n'existe pas d'utilitaire pour ça ?

    Aussi, j'ai téléchargé Delphi 10 Seattle pour tester, je n'arrive pas à installer ZeosLib (erreurs de compilation).

    Merci pour ton aide
    Cela frise le hors sujet

    plutôt que de se brancher sur une discussion qui n'a pas grand chose à voir pourquoi ne pas ouvrir deux sujets ?
    1- Installation de Zeoslib avec Delphi 10 Seattle dans delphi/composants << indiquer quelle version de ZEOSDBO
    2- Migration Paradox vers Firebird (3) dans Firebird/Outils ou Delphi Base de données

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je sais que cette discutions est fermer, mais le programme que tu fais tu va l'utiliser plus d'une fois??

    si oui, sa veux dire que tu supprime totalement les tables, puis tu les remplis??? alors il faut faire un bakup restor chaque fois.

    ou tu fais un simple "insert or update" avec sélection de toute la table??,
    ou tu ajoute un champs datetime qui contient dernier datetime de modification puis tu sélectionnes seulement les enregistrements modifier après un datetime connut!!!

    tout sa tu peux le faire avec procédures stocker dans la base de préférence sur dans la base destination (si les 2 bases sont sur le même serveur)

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

Discussions similaires

  1. SQL Server 2005: Problème avec les transaction logs
    Par n8ken dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2008, 15h42
  2. probléme avec les transaction
    Par amazircool dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/12/2007, 16h44
  3. Controler les insertions avec les transactions
    Par robocop2776 dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/05/2007, 14h13
  4. problème avec les transactions
    Par Invité dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/07/2005, 11h43
  5. [JDBC] probleme avec les transactions
    Par lthomas dans le forum JDBC
    Réponses: 2
    Dernier message: 17/06/2005, 17h10

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