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 :

Utilisation d'une transaction


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 41
    Points : 29
    Points
    29
    Par défaut Utilisation d'une transaction
    Bonjour à tous

    Je développe une application dans laquelle je mets à jour les tables d'une base dans des boucles de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for n:= 0 to n do begin
        RS.AddNew
        ...
        RS.Update
        end;
    Lorsque ma base se trouve sur un serveur, la mise à jour mets environ quatre fois plus de temps ! J'imagine que ce qui ralentit est l'accès au serveur à chaque Update.

    Est-ce que l'utilisation d'une transaction résoudrait ce problème, et, si oui, comment l'utiliser (mes premières tentatives n'ont pas été concluantes )

    Merci de votre aide
    Bernard

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    salut,

    quelle base utilises tu :

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    J'utlise une base Access, avec les composants KADao PE. Comme dans cette version light, il n'y a pas de classe TDataTable, j'ai créé un composant TBMRecordSet qui me permet de travailler avec des propriétés et méthodes comme dans VBA (pardon pour l'insulte ). Tout marche impec-nickel-chrome en "normal".

    KADao offre les méthodes StartTransaction, Commit et Rollback.

    J'ai essayé en mettant mon Start... avant la boucle, et mon Commit après : il me dit "Index out of bounds" (le truc dans le genre qu'on peut avoir si on donne un indice supérieur au nombre d'éléments d'une liste ou d'un tableau).

    Je rappelle que si je fais mon affaire en dehors de toute transaction, ça marche au poil

    En tout cas, merci BBOU de t'occuper de mon cas
    Bernard

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    J'ai quand même réfléchi de mon côté pendant ce temps

    J'ai réimplémenté les méthodes BeginTrans, CommitTrans, et Rollback d'Access dans un composant descendant de TKADaoDatabase, dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TBMAccessDatabase.BeginTrans
    begin
         CoreWorkspace.BeginTrans
    end;
    ...et là, ça marche

    Cependant, en regardant dans l'aide d'Access sur les transactions, il semble que ce système n'économise absolument pas les accès "disque/serveur"

    Donc ma demande initiale devient uniquement ce qu'elle était en partie au départ : sachant que j'importe un .CSV, comment pourrais-je optmiser ses accès ? ...en attendant, je continue à réfléchir de mon côté
    Bernard

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    salut,
    j'utilise la même méthode pour Oracle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     db.StartTransaction;
    try
       db.Execute(sReq,nil,FALSE,nil);
       if db.InTransaction then
          db.Commit;
    except
       db.Rollback;
       raise;
    end;
    par contre, lorsque je veux écrire de nouveaux enregistrements dans une base accés ( pour les insertions uniquement) je passe par un composant TTable. L'insertion est extremement rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tbl.Open;                                                  // j'ouvre ma table
    tbl.EmptyTable;                                         // je la vide
    tbl.AppendRecord([la liste de tes champs]); // j'écris
    tbl.Close;                                                  // je referme ma table
    Mais concernant la première méthode je n'en connait pas de plus rapide, car tu passes directement par la database


  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Est-ce que l'utilisation d'une transaction résoudrait ce problème, et, si oui, comment l'utiliser (mes premières tentatives n'ont pas été concluantes )
    Je ne sais pas si tu utilises BDE, mais peut-être qu'en employant BatchMove, cela permettrait pas d'incorporer ton csv plus rapidement.

    Regarde ce lien

    http://delphi.developpez.com/faq/?page=BDE
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Non, je n'utilise pas BDE, puisque je travaille sur Delphi 7 Perso C'est pour cette raison que KADao PE est le seul moyen (gratuit) pour moi de pouvoir travailler avec des bases de données ... et ça marche très bien !

    La solution proposée par BBOU (l'insertion en une fois de mes enregistrements) me semble assez délicate dans la mesure où mon CSV peut "peser" jusqu'à 4 Mo !... et le fait qu'il faille construire ça d'après ce qui n'est en fait qu'un fichier texte, que les réels sont au format français (pour le point décimal).

    En fait mes CSV sont des fichiers d'exportation issus d'Impromptu de Cognos. Je me suis en définitive lancé dans l'exportation au format DBF, en liant ensuite les tables crées à mon MDB. Apparemment ça marche, sous réserve tout de même de quelques adaptations

    Donc ma question n'est plus vitale (si jamais elle l'était ), mais si l'un (ou l'une) d'entre vous avait une suggestion sur une intégration performante de fichiers CSV au sien d'une base Access, je suis preneur
    Bernard

Discussions similaires

  1. Utilisation d'une transaction distribuée nécessaire ou non ?
    Par lacombefr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/07/2008, 17h38
  2. Utilisation d'une transaction dans une proc
    Par Sickfrid dans le forum DB2
    Réponses: 1
    Dernier message: 08/03/2007, 11h43
  3. Utilisation d'une transaction sous Mysql 5.0
    Par sanqara dans le forum Administration
    Réponses: 1
    Dernier message: 22/07/2006, 14h37
  4. Utilisation d'une fonction Transact-SQL ds une requête SQL
    Par Fl0ppeur dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h42
  5. utiliser une transaction avec le composant DBExpress
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/06/2005, 14h10

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