Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Bases de données
Bases de données Vos questions concernant les bases de données (BDE, Access, SqlServer...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/12/2012, 17h15   #1
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
Par défaut _Recordset + ADO + restauration de données

Bonjour,

A partir d'une connexion TADOConnection, j'exporte les données et structure d'une table dans un fichier XML.

Code :
1
2
3
4
5
6
 
var
  R: _Recordset;
begin
  R := ADOConnection1.Execute('SELECT * FROM Jetons');
  R._xSave('D:\Jetons.csv', adPersistXML);
Ça me donne un fichier XML avec structure et données de la table.


Est-il maintenant possible d'utiliser ce même fichier pour restaurer une table dans la base ? Faut-il passer par ADOX ou une commende SQL que j'aurais zappé permet-elle de faire ça facilement ?

A défaut, je passerai par une lecture du fichier XML mais j'imagine qu'il doit exister quelque chose de tout prêt !

Papy !
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 22h06   #2
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Bonjour,

Regardez cet article : Initiation à XML et Delphi 6. AMHA, il y a matière pour atteindre votre objectif...
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 10h36   #3
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
Merci ce n'est pas vraiment ce que je cherchais. Lire un fichier XML, avec ou sans l'assistant liaison XML de Delphi, je sais faire. Je cherche en fait une manière simple de sauvegarder contenu d'une table d'une base de données (_xsave) pour pouvoir recréer la table ultérieurement en cas de problème. Une procédure de restauration de données tables par tables.

Pour l'instant, j'en suis à une solution intermédiaire.
  1. Sauvegarde de la table dans un fichier
  2. Chargement du fichier dans un Recorset
  3. Lecture des lignes du recordset et ajout à la table originelle une fois vidée

ça fonctionne mais quand une table contient beaucoup d'enregistrements, ça prend beaucoup de ressources. C'est pour ça que je pensais plutôt à un genre "BULK INSERT" du SQL.

Mais faute de mieux ...

Merci tout de même de l'intérêt porte à ma question
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 19h27   #4
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Citation:
Envoyé par Papy214 Voir le message
ça fonctionne mais quand une table contient beaucoup d'enregistrements, ça prend beaucoup de ressources. C'est pour ça que je pensais plutôt à un genre "BULK INSERT" du SQL.
Dans ce cas, avez vous fait l'insertion dans la base via la commande UpdateBatch(arAll) du RecordSet une fois les données chargées en mémoire ?

Autre piste, construire un script sql avec insertion par lot et commit sur le lot et pas sur chaque insertion...
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 07h17   #5
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 217
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 217
Points : 7 284
Points : 7 284
Citation:
Envoyé par Ph. B. Voir le message
construire un script sql avec insertion par lot et commit sur le lot et pas sur chaque insertion...
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 10h15   #6
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
Pour UpdateBatch, soir la solution n'est pas adaptée à mon cas, soit je l'utilise mal. J'ai testé le code suivant qui ne restaure pas mes données.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
  T, G: TADOTable;
begin
 
  if FileExists('D:\JetonsT.adtg') then
    DeleteFile('D:\JetonsT.adtg');
 
  T := TADOTable.Create(Self);
  T.Connection := ADOConnection1;
  T.TableName := 'Jetons';
  T.Open;
  T.SaveToFile('D:\JetonsT.adtg');
  T.Close;
  T.Free;
 
  ADOConnection1.Execute('DELETE FROM Jetons');
 
  G := TADOTable.Create(Self);
  G.ConnectionString := ADOConnection1.ConnectionString;
  G.TableName := 'Jetons';
  G.LoadFromFile('D:\JetonsT.adtg');
  G.UpdateBatch();
  G.Free;
Au moment du LoadFromFile, Le Tablename est remplacé par le nom du fichier (normal). Et si je le mets après, Delphi se plaint parce qu'il ne peut pas faire cette opération sur un ensemble de données ouvert.


Je vais me tourner vers une solution script SQL.

Merci à vous deux.
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 22h55   #7
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Bonjour,

Je suppose que je dispose d'un objet ADOConnection1 de type TADOconnection dans ma fiche de type TForm1.

Il faut faire un truc du genre :
Code :
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
procedure TForm1.Import;
var
  DSetSrc,                     
  DSetDest: TADODataSet;
  i: Integer;
begin
  DSetDest := TADODataSet.Create(nil);
  try
    // Préparer l'ensemble de données pour un traitement par lot
    DSetDest.Connection := ADOConnection1;
    DSetDest.CursorType := ctStatic;
    DSetDest.LockType := ltBatchOptimistic;
    DSetDest.CommandType := cmdText;
    DSetDest.CommandText := 'SELECT * FROM Jetons';
    DSetDest.Open;
    //
    DSetSrc := TADODataSet.Create(nil);
    try
      DSetSrc.LoadFromFile('D:\JetonsT.adtg');
      // Transférer les données
      DSetSrc.First;
      while not DSetSrc.Eof do
      begin
        DSetDest.Append;
        for i := 0 to DSetSrc.FieldCount - 1 do
          DSetDest.Fields[i].Value := DSetSrc.Fields[i].Value;
        DSetDest.Post;
        DSetSrc.Next;
      end;
      // Appliquer les mises à jour
      DSetDest.UpdateBatch(arAll);
    finally
      DSetDest.Close;
      DSetSrc.Free;
    end;
  finally
    DSetDest.Free;
  end;
end;
Dans l'exemple, je n'ai pas purgé préalablement la table Jetons.
__________________
Philippe.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 09h57   #8
Papy214
Membre chevronné
 
Inscription : novembre 2007
Messages : 1 232
Détails du profil
Informations personnelles :
Âge : 51

Informations forums :
Inscription : novembre 2007
Messages : 1 232
Points : 709
Points : 709
Envoyer un message via ICQ à Papy214
C'est un peu ce que je pensais faire au départ mais sans connaître ce UpdateBatch.

Merci pour le coup de main et joyeux futur noël !
Papy214 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h21.


 
 
 
 
Partenaires

Hébergement Web