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

ASP.NET Discussion :

[tutoriel] Importer et exporter des données en masse au travers d'une application ASP.Net


Sujet :

ASP.NET

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut [tutoriel] Importer et exporter des données en masse au travers d'une application ASP.Net
    Salut,

    Voici un petit tutoriel: Importer et exporter des données au travers d'une application ASP.Net

    Il explique comment utiliser la sérialisation/desérialisation XML et Excel 2007 pour exporter et importer des données en masses dans une base de données.

    Qu'en pensez-vous? N'oubliez pas de "Noter la discussion" pour évaluer l'article

    Merci d'avance

    A+

    Immo
    "Winter is coming" (ma nouvelle page d'accueil)

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Article intéressant .

    Je me demandais juste ce qu'il se passe lorsqu'on tente d'importer ou d'exporter un volume très important de données, trop important en tout cas pour que l'exécution puisse être réalisée dans la durée maximale d'exécution d'une requête ASP.NET (httpRuntime / executionTimeout). C'est une contrainte, lorsqu'on fait du traitement de masse, à ne pas ignorer sur le web non ?

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Salut,
    Citation Envoyé par Kaidan Voir le message
    Article intéressant .
    Merci

    Dans la mesure où la durée du timeout peut être étendue, il n'y a pas vraiment de limites.

    Dans l'absolu, c'est le temps de téléchargement du fichier qui peut être un peu long. Pour accélérer cette étape, on peut ziper le fichier. Comme XML est du texte, le taux de compression devrait être satisfaisant.

    Sinon, pour le reste du processus, on peut "passer la main" et ne pas attendre la fin de la mise à jour. Ou bien, on peut imaginer sauvegarder le fichier sur le serveur et programmer une tâche planifiée sur un programme console pour faire la mise à jour.

    A+

    Immo
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre régulier
    Homme Profil pro
    Informaticien
    Inscrit en
    février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : février 2011
    Messages : 53
    Points : 83
    Points
    83
    Par défaut
    Merci beaucoup pour ce tutoriel très intéressant et aussi très utile

    Si tu n'avais pas écrit ce tutoriel, je pense que j'aurais perdu encore bien plus de temps pour terminer mon travail.

    En tous cas un grand merci de ma part

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Bonjour,
    En général les SGBD proposent des solutions d'import export de fichier qui seront surement beaucoup plus rapide...

    Avez vous pensé à des tests de performances? je doute importer un fichier/table de plusieurs giga puissent être obtenu avec des performances acceptable?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #6
    Expert confirmé
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 1 467
    Points : 4 181
    Points
    4 181
    Par défaut
    Citation Envoyé par iberserk Voir le message
    En général les SGBD proposent des solutions d'import export de fichier qui seront surement beaucoup plus rapide...

    Avez vous pensé à des tests de performances? je doute importer un fichier/table de plusieurs giga puissent être obtenu avec des performances acceptable?
    Le tuto d'Immobilis répond à un scénario donné, pas tous et c'est normal. Mais il a surtout le mérite d'être clair et didactique.

    Évidemment pour des scénarios plus complexes, ou bien pour une forte volumétrie, on se penchera plutôt vers des packages SSIS par exemple.

  7. #7
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Salut,
    Citation Envoyé par Nicolas Esprit Voir le message
    Le tuto (...) répond à un scénario donné, pas tous et c'est normal.
    Tout à fait. Pour la simple et bonne raison qu'il ne viendrait pas à l'esprit d'un développeur d'utiliser un WebForm pour télécharger un fichier de plusieurs Giga.

    Cet outil est destinée à un utilisateur final. J'ai souvent eu des situations où les utilisateurs devaient mettre à jour de nombreuses données et pour lesquels un WebForm ne répondait pas au besoin car trop lent. Leur permettre de travailler avec un tableur (Excel) est très confortable. Sinon, je ne crois pas non plus qu'un utilisateur final ait les moyens logiciels pour exploiter un fichier de cette taille sur son ordi.

    Enfin, d'un point de vue base de données (l'insertion des enregistrements) si la table est correctement indexée, il ne devrait pas y avoir de soucis. Le DataContext reste ouvert en dehors de la boucle foreach. Cela permet d'ouvrir une seule connexion. Je crois savoir que cela te préoccupe

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Je crois savoir que cela te préoccupe
    Oui

    Bien sûr très bon tuto,je ne le remettais pas en question mais comme on y parlait 'd'insertion en masse' j'ai fait l'amalgame avec des volumétries déjà moyennes...

    En revanche je souhaiterais rebondir là dessus:

    Pour la simple et bonne raison qu'il ne viendrait pas à l'esprit d'un développeur d'utiliser un WebForm pour télécharger un fichier de plusieurs Giga
    Tu as bien de la chance on doit pas avoir les même... même si les miens sont éduqués maintenant :-)

    Enfin, d'un point de vue base de données (l'insertion des enregistrements) si la table est correctement indexée, il ne devrait pas y avoir de soucis. Le DataContext reste ouvert en dehors de la boucle foreach. Cela permet d'ouvrir une seule connexion.
    La par contre je ne peut que vous contredire à 100%, pour ca utiliser un code client est une catastrophe, pour allez je vais être gentil 15000 enregistrements entre le rapatriement des objets (select pour savoir si on le modifie ou si on l'insert...) vous générez au minimum 15000*2=30000 requete 15000 SELECT et 15000 INSERT... tout celà transitant joyeusement par le réseau qui plus est...

    La première chose que j'ai refaite dans ma société actuelle est de refaire TOUT les imports (clients, articles etc) d'un ERP vers un site EBUSINESS fait en LINQ!!!!

    Je suis passé pour 400000 enregistrements d'une dizaine d'heures (oui!) à 53 secondes....
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Citation Envoyé par iberserk Voir le message
    La par contre je ne peut que vous contredire à 100%, pour c
    Ah? Dis nous
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Ah? Dis nous
    J'avais pas fini
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  11. #11
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Ceci dit j'ai passé ton tuto à l'equipe de dev...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Citation Envoyé par iberserk Voir le message
    J'avais pas fini
    Nan mais franchement, ça m’intéresse.

    Personnellement, j'utilise surtout les compteurs de performance de Windows pour suivre les compteurs "General Statistics" du serveur SQL. Qu'est-ce que tu utilises? Sachant que le gain de temps d’exécution est évidement
    "Winter is coming" (ma nouvelle page d'accueil)

  13. #13
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Citation Envoyé par iberserk Voir le message
    vous générez au minimum 15000*2=30000 requete 15000 SELECT et 15000 INSERT
    Comme je ne suis pas DBA. Peux-tu me dire comment cela se traduit au final pour le serveur de base de données? Il faut tout de même bien un "INSERT" pour chacun de mes enregistrements qui n'existe pas déjà, non? Comment traduire efficacement côté SQL le test pour mettre à jour au lieu d'insérer?
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Et bien justement il ne faut pas le faire Côté code.

    Pour résumer faire cela en utilisant LINQ(dans les grandes lignes):

    ->J'ouvre mon fichier ligne par ligne (déjà çà... ca doit faire tiquer un fichier peut se traiter de manière ensembliste par des requêtes SQL, ce que ne permet pas le code client)

    Pour chaque ligne (disons des Utilisateur):
    J'instancie mon objet monUser utilisateur via LINQ (un bon SELECT * du coups...)
    Je fais mon test:
    Si monUser est null j'instancie un nouvel objet pour faire mon insert...
    Sinon je met à jour les données de l'objet instancié avec les données de ma ligne...

    Je fais donc cela 15000 fois (15000 lignes dans le fichier)...

    Et je fais un submitChanges qui va faire 15000 requêtes (INSERT ou UPDATE)


    Donc:
    1-Vous avez remonté 15000 lignes de la base de données.... une par une par le réseau (donc 15000 fois la latence réseau etc).
    Vous avez instancé 15000 objets...
    Et vous avez envoyé 15000 INSERT dans la base.

    Du coups vous mettez 15000 fois à jour index et stats de votre table.


    Importer les 15000 LIGNES du fichiers(BULK INSERT) dans une table (environ 2 secondes :-))
    puis deux requetes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO customer WHERE NOT EXISTS...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UPDATE C
       SET C.colonneA=TT.colonneA,
             C.colonneB=TT.colonneB
    FROM customer C
       INNER JOIN tableTemp TT
          ON TT.code=C.code
    Donc deux requêtes seulement...

    Ça réponds à votre question?

    Donc deux
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  15. #15
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Il faut tout de même bien un "INSERT" pour chacun de mes enregistrements qui n'existe pas déjà, non?
    Et oui...

    Vous avez la nouvelle instruction MERGE qui plait beaucoup aux développeurs...

    http://technet.microsoft.com/fr-fr/l.../bb510625.aspx
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  16. #16
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 1 996
    Points : 3 105
    Points
    3 105
    Par défaut
    Article intéressant.
    En effet, il ne concerne que certains scénarii mais me paraît tout à fait utile.

    Pour ce qui est de l'instruction MERGE, attention, elle n'est présente sous SQL Server que depuis la version 2008. Et de ce que je peux voir, il y a encore de très nombreux projets sous 2005 voire même 2000.
    On peut cela dit se débrouiller avec l'instruction OUTPUT dans ces versions pour réaliser à peu près la même chose.

  17. #17
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Ça réponds à votre question?
    Point de vue très intéressant. Le code ne peut évidement pas lutter contre un Bulk Insert. Incontestablement, le code que je propose génère beaucoup de requêtes. Il y a forcement des trames qui passent et occupent de la bande passante. Ce sont les incompressibles.

    Cependant, le bulk insert correspond lui aussi à un besoin métier très spécifique. La création du fichier de bulk, son dépôt sur un partage, etc. sont autant de contraintes qu'il faut prendre en compte. J'ai rarement eu besoin de faire appel à lui. A l'occasion d'un besoin de mise à jour de millions d'enregistrements, nous avons fait appel au SQL Server Service Broker.

    Par ailleurs, j'ai une certaine réticence à mettre trop de logique hors du code. Dans le cas du tutoriel (simpliste), il serait peut-être avisé de récupérer la totalité de la table (15000 enregistrements sont négligeables), préparer la mise à jour et l'insertion par le code et renvoyer les données. Par ailleurs, le téléchargement de ces données pourrait très bien déclencher d'autres processus. De plus, il ne faut pas oublier non plus que le code permet facilement de traiter les enregistrements dont le traitement auraient pu échouer.

    Sinon, il faudrait tester tout cela en environnement de prod (sur mon portable c'est pas top). Localement, je ne génère que 5 ou 6 connections. Sans compter que ma requête LINQ n'est pas compilée.

    Je passerai un petit peu de temps pour prendre en compte ton scénario
    "Winter is coming" (ma nouvelle page d'accueil)

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : mars 2004
    Messages : 6 559
    Points : 9 414
    Points
    9 414
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Et oui...
    Donc dans tous les cas ton scénario vérifie
    Du coups vous mettez 15000 fois à jour index et stats de votre table.
    Non?

    Ci dessous les compteurs de perf. J'ai SQL Server 2008 et le compteur "Connection Reset/sec" est nouveau. Faut que je vois ce qu'il indique.
    Images attachées Images attachées  
    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    novembre 2004
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2004
    Messages : 1 792
    Points : 3 127
    Points
    3 127
    Par défaut
    Je ne pousserais pas le débat plus loin car à par peut être pour la notion de logger les lignes en erreurs je suis en désaccord sur tout le reste...

    Les performances passées quelques dizaine de milliers de lignes sont d'un autre monde et traiter de la données et assurer leur cohérence... c'est la rôle de la base...

    Que ferez vous si d'autres applications développées par d'autres personnes commencent à 'taper' dans votre base et la vérole complétement car ils n'ont pas les mêmes règles métiers embarquées dans LEUR code client?

    Mais je suis confiant, les tests que vous comptez faire appuieront ma position.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  20. #20
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    novembre 2010
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 034
    Points : 4 132
    Points
    4 132
    Par défaut
    J'ai une problématique similaire dans le projet sur lequel je travaille, je voulais savoir si le faite de travailler avec des listes ne diminuerai pas le temps d’exécution.

    On utiliserai 3 listes:
    -une correspondante à tous les champs dans la base on fait un select dans la base pour récupérer tous les lignes de la table qui nous intéresse (et que les champs qui nous intéresse pour la comparaison)
    -la seconde correspondante au mise à jour
    -la troisième aux insertions

    Comme ça à chaque ligne de notre fichier on fait la comparaison avec la première liste et ça nous permettra de déterminer dans quel liste placer cette ligne.
    Une fois que tout est terminé on fait un insertallonsubmit de la liste d'insertion et on fait les update grâce à la liste de mise à jour.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/11/2011, 12h24
  2. importer et exporter des données depuis excel
    Par thonyyzz dans le forum C++
    Réponses: 2
    Dernier message: 22/04/2008, 20h18
  3. importer et exporter des données
    Par denza1 dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/12/2004, 16h34

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