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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    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
    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 : 44
    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
    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
    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 : 44
    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
    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 Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 114
    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.

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