2009-02-05 6 views
2

J'ai une application winform qui utilise certains services Web référencés pour obtenir des données. Les données renvoyées sont un tableau d'objets que je boucle en boucle et que j'ajoute à un ensemble de données. Lorsque j'appelle le service, il faut souvent 2 ou 3 minutes pour obtenir toutes les données.Comment conserver les ensembles de données remplis dynamiquement pour rester avec le programme?

Si l'utilisateur quitte le programme et revient plus tard, je ne veux pas qu'ils aient à télécharger de nouveau toutes les données. Lorsque j'exécute l'application en mode débogage, il n'y a pas de persistance des informations téléchargées. ce qui m'inquiète.

Je suis toujours en "mode développement", donc je n'ai pas encore vraiment mis en place un installateur pour tester si l'information reste avec l'application.

Je suis curieux de savoir deux choses:

  1. Est-ce que les données stockées dans l'ensemble de données restent après la sortie de l'utilisateur?
  2. Sinon, que recommanderiez-vous sur la façon d'accomplir cela?
  3. J'ai considéré XML pour le stockage; est-ce la meilleure option quand vous avez 9-10 Mo de données?
    Edit: Résultat final: OK - voici le résultat final (merci à tous pour votre réponse rapide)

Lorsque la sortie de l'application, j'appeler une fonction pour enregistrer les données. Voici un extrait:

using System.IO; 
    using System.Runtime.Serialization; 
    using System.Runtime.Serialization.Formatters.Binary;    
    FileStream fs; 
    IFormatter formatter = new BinaryFormatter(); 
    //activities 
    if (actList.Length > 0) 
    { 
     fs = new FileStream("activities.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
     formatter.Serialize(fs, actList); 
     fs.Close(); 
    } 
    //users 
    if (userList.Length > 0) 
    { 
     fs = new FileStream("users.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
     formatter.Serialize(fs, userList); 
     fs.Close(); 
    } 

Les paramètres userList et actList sont des objets List issus de l'appel de services Web.

Une autre chose que j'ai implémentée (légèrement hors sujet) est de créer un paramètre d'application à sauvegarder lorsque l'utilisateur a fait un téléchargement depuis le service web. Il est enregistré comme

Properties.Settings.Default.last_downloaded 

Si l'utilisateur clique sur le bouton de téléchargement, ils sont invités à la date de leur dernière effectuées le téléchargement et sont donnés une chance de dire « non ».

Merci encore pour votre aide!

+0

Si vous êtes basé sur un service Web, pensez à ClickOnce au lieu d'un programme d'installation standard, ce qui est beaucoup plus simple à déployer. –

+0

Je ne pense pas pouvoir utiliser ClickOnce et conserver les données en même temps, n'est-ce pas? Je pensais que avec ClickOnce, je ne peux pas "laisser derrière" des données: http://msdn.microsoft.com/en-us/library/ms973805.aspx – JayTee

+0

Nevermind ... répondu à ma propre question :) – JayTee

Répondre

2

Un objet .NET n'a pas de persistance sauf si vous l'écrivez vous-même - par exemple en sérialisant un fichier dans le profil de l'utilisateur (ou isolated storage pour ClickOnce).

Note: personnellement, je n'utiliserais pas du tout DataSet dans ce scénario; Si vous téléchargez les données sous la forme d'une liste d'objets, alors gardez-les comme ça - List<T> etc.

Re xml: 9-10Mb est grand mais pas immense. Cela dépend vraiment de la nature des données et d'autres exigences; À moins que vous n'utilisiez déjà la compression Web (GZIP, etc.), vous pourriez constater que les données sont transférées plus rapidement avec un format plus compact, tel que csv, ou un format binaire tel que protocol buffers.

+0

J'utilise en fait l'ensemble de données comme source de données pour un couple de datagridviews et de listboxes; est-il un moyen d'utiliser la liste pour peupler ces choses? – JayTee

+0

La liste peut être utilisée comme DataSource pour DataGridView et ListBox etc. –

+0

Strictement parlant, tout ce qui est 'IList' ou' IListSource' fonctionnera - 'List ' bénéficie d'un indexeur 'public T this [int]' qui fournit des métadonnées plus fortes que juste 'IList'. Mais point principal: il n'y a aucun problème à utiliser 'List ' –

1

Vous devez conserver manuellement les données que vous souhaitez enregistrer. Ce que vous pouvez faire est de prendre votre jeu de données, et, lorsque votre application se ferme, serialize l'ensemble de données dans un fichier.Ensuite, lorsque l'application s'ouvre, si le fichier existe, désérialisez l'ensemble de données de ce fichier au lieu d'appeler le service Web.

+0

Je peux seulement marquer 1 comme réponse acceptée - même si vous avez tous les deux aidé – JayTee

Questions connexes