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

VB.NET Discussion :

Petite question d'optimisation


Sujet :

VB.NET

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut Petite question d'optimisation
    Bonjour à tous,

    Voici un extrait de mon code qui s'execute sur un serveur SQL en réseau :

    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
     
    Dim ConnSQL As String = "Data Source=" & SelectedServer & ";Initial Catalog=" & SelectedDatabase & ";Persist Security Info=True;User ID=" & Username & ";Password=" & Password & ""
     
    Dim sqlConnect As SqlConnection = New SqlConnection(ConnSQL)
    sqlConnect.Open()
     
    ' Création du SqlDataAdapter
    Dim da As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter("Select * from Clients", sqlConnect)
     
    ' Création d'un DataSet
    Dim ds As DataSet = New DataSet()
     
    ' Remplissage du DataSet avec le SqlDataAdapter
    da.Fill(ds)
     
    ' Ecriture du fichier XML au moyen de la méthode WriteXml
    ds.WriteXml(FolderArchive & FileName & ".xml", XmlWriteMode.IgnoreSchema)
    Cependant, la table étant tellement grosse, cela met énormément de temps pour que le fichier soit créer sur un share réseau.

    Existe t il un moyen pour optimiser cela et créer le fichier rapidement ?

    Merci à tous pour vos réponses...

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu peux utiliser un DataReader et écrire l'XML en fonction des données retournées en utilisant les méthodes de XmlDocument. Tu éviteras ainsi de charger toute la table en mémoire.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Peut-être que ca marcherait mieux en n'utilisant pas de DataSet, mais en récupérant simplement le résultat de la requête avec un DataReader, et en générant le XML "manuellement". Qqch comme ça :

    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
     
    Dim cmd as SqlCommand
    Dim dr as DataReader
    cmd = sqlConnect.CreateCommand()
    cmd.CommandText = "select * from clients"
    dr = cmd.ExecuteReader()
     
    Dim sw as StreamWriter
    sw = New StreamWriter(FolderArchive & FileName & ".xml")
    sw.WriteLine("<?xml version=""1.0"" encoding=""UTF-8""?>")
    sw.WriteLine("<Clients>")
    While dr.Read()
     
        sw.WriteLine("  <Client>")
        sw.WriteLine("    <Name>{0}</Name>", dr("name"))
        ' et ainsi de suite pour les autres champs
        sw.WriteLine("  </Client>")
     
    Wend
    sw.WriteLine("</Clients>")
    sw.Close()
    dr.Close()
    Mais c'est pas sûr que ce soit plus efficace, je suppose que le composant DataSet est assez optimisé... de toutes façons si il y a beaucoup de données ce sera long quelle que soit la méthode.

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Peut-être que ca marcherait mieux en n'utilisant pas de DataSet, mais en récupérant simplement le résultat de la requête avec un DataReader, et en générant le XML "manuellement". Qqch comme ça :

    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
     
    Dim cmd as SqlCommand
    Dim dr as DataReader
    cmd = sqlConnect.CreateCommand()
    cmd.CommandText = "select * from clients"
    dr = cmd.ExecuteReader()
     
    Dim sw as StreamWriter
    sw = New StreamWriter(FolderArchive & FileName & ".xml")
    sw.WriteLine("<?xml version=""1.0"" encoding=""UTF-8""?>")
    sw.WriteLine("<Clients>")
    While dr.Read()
     
        sw.WriteLine("  <Client>")
        sw.WriteLine("    <Name>{0}</Name>", dr("name"))
        ' et ainsi de suite pour les autres champs
        sw.WriteLine("  </Client>")
     
    Wend
    sw.WriteLine("</Clients>")
    sw.Close()
    dr.Close()
    Mais c'est pas sûr que ce soit plus efficace, je suppose que le composant DataSet est assez optimisé... de toutes façons si il y a beaucoup de données ce sera long quelle que soit la méthode.
    Sauf qu'écrire l'XML comme ça dans un fichier, c'est vraiment sale. Il existe tout un tas de méthodes dans le namespace System.Xml et dans la classe XmlDocument pour créer un XML.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Sauf qu'écrire l'XML comme ça dans un fichier, c'est vraiment sale
    Certes... mais ça a le mérite d'être simple et vite écrit, et pour l'exemple je n'ai pas voulu rentrer dans le détail. Mais effectivement il vaudrait mieux utiliser un XmlWriter

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 168
    Points : 25 098
    Points
    25 098
    Par défaut
    si tu veux mettre le fichier sur le meme serveur que celui disposant d'sql server
    et que c'est sql server 2005

    tu peux faire une procédure stockée en vb.NET et donc qui sera sur SQL server et écrira le fichier, ca évite le transfert sur le réseau de toutes les données
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Merci pour vos réponses.

    En fait il s'agit d'un application cliente qui se connecte sur un serveur SQL. Donc, le fichier est écrit sur un partage réseau, et le serveur SQL reconnait le chemin d'accès du fichier XML.

    Par contre, j ai effectivement besoin de toute la table...

    Merci à tous pour vos réponses.

  8. #8
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par will2taz Voir le message
    Par contre, j ai effectivement besoin de toute la table...
    Cela ne t'empêche pas d'utiliser un DataReader, tu récupéreras les données sequentiellement au lieu de tout charger en mémoire en une fois.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Merci SaumonAgile. Peux tu m'éclairer un peu sur le DataReader stp ?

    Merci beacuoup...

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par will2taz Voir le message
    Merci SaumonAgile. Peux tu m'éclairer un peu sur le DataReader stp ?

    Merci beacuoup...
    Voila pour toi : http://dotnet.developpez.com/tutoriels/ado1/vbnet/

    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Ok, merci beacoup, mais comment je fais maintenant pour récupérer tout sa dans un fichier XML ??? Car avec le DataSet, y avait le WriteXML...

    Merci

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    1/Je vais proposé une autre voie pour raccourcir le temps de traitement.Tu écris,
    cela met énormément de temps pour que le fichier soit créer sur un share réseau. Est
    La question que je me pose est. Est-ce que le temps est perdu parce que c'est un share réseau. As-tu essayé de faire le traitement en deux temps .
    a/Tu crées ton fichier en local en utilisant ta technique actuelle
    b/Tu déplaces ton fichier vers ton share réseau.
    Est-ce que cette méthode te fais gagner du temps. Cela t'éviterai de te lancer dans un développement "compliqué" pour rien.

    2/Pour ta question
    ok, merci beacoup, mais comment je fais maintenant pour récupérer tout sa dans un fichier XML ??? Car avec le DataSet, y avait le WriteXML...
    Tu utilises les fonctions de namespace System.XML. Tu te crées un XmlDocument à la main en rajoutant les noeuds.
    Ce n'est pas le dataset qui fait le boulot c'est toi.
    Cordialement
    Soazig

  13. #13
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Et bien en fait, je pense avoir résolu mon soucis avec le DataReader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * From Clients For Xml auto, elements
    Cela me retourne un resultat sous la forme XML, et j'utilise un StreamWriter apres. Je pense que cela sera mieux que de tout codé à la main ?

    Qu'en penssez-vous ? Merci

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ca m'a pas l'air très conforme ANSI ce truc là . C'est spécifique à SQL Server non ? C'est pratique en tous cas...

  15. #15
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Oui, c'est vrai Cela résoud bien des problèmes !


Discussions similaires

  1. [Python 2.X] Petite question d'optimisation sur les tableaux
    Par Sve@r dans le forum Général Python
    Réponses: 17
    Dernier message: 01/02/2015, 22h57
  2. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  3. :?: question d'optimisation!
    Par Stopher dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/06/2004, 17h15
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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