2009-01-22 5 views
3

Je dois obtenir un DataTable à partir de SQL, puis le convertir en XML (je ne peux pas utiliser SQL XML) et enregistrer dans un fichier. Le problème est que le fichier va être de 5 Go, et je n'ai pas assez de mémoire pour le télécharger et le convertir en XML en même temps en mémoire. Je sais que je devrais être en mesure d'utiliser un DataReader pour convertir et transmettre les données au flux de fichiers en morceaux, mais je ne sais pas comment le faire réellement. Comment puis-je faire ce qui suit?In .NET, Streaming de données SQL à un fichier

  1. Se connecter au serveur SQL de manière asynchrone
  2. Appelez la procédure stockée de manière asynchrone
  3. données lues à partir du DataReader de manière asynchrone
  4. de données Convertir du DataReader au format XML et enregistrer le fichier de manière asynchrone

Tout cela doit être asynchrone car c'est sur un serveur traitant plusieurs requêtes et nous ne pouvons pas avoir de thread bloquant pour chacune d'entre elles.

+0

Quel type de serveur traite plusieurs demandes? ASP.NET? Service Windows? – Kev

Répondre

2

Pourquoi avez-vous besoin de faire quoi que ce soit de manière asynchrone? Cela peut mieux fonctionner, mais sera beaucoup plus compliqué.

La façon simple de le faire:

  • Exécutez la requête pour obtenir un DataReader
  • Créer un XmlWriter écrit au fichier
  • Essayez de lire une ligne
    • S'il y a plus de rangées à gauche, c'est fini. (Assurez-vous de fermer l'auteur/la connexion, etc.)
    • Si vous obtenez une ligne, écrivez-la dans le XmlWriter (ajoutez un élément ou ce que vous devez faire).
  • Retour à l'étape précédente.
+0

J'ai besoin que tout soit asynchrone pour que je n'ai pas de blocage de thread pour chaque requête. Le nombre de threads pourrait devenir énorme et je dois gérer une tonne de demandes. – skb

1

Y a-t-il quelques grandes lignes (BLOB), ou beaucoup de petites rangées? Pour les grandes BLOBs, ces deux articles contiennent le code nécessaire pour gérer BLOBs SQL Server en mode streaming à partir de C#:

La première poignées BLOBs ordinaires, le second traite des BLOB de FILESTREAM.

Pour de nombreuses petites lignes, vous n'avez pas besoin de rien de spécial, ouvrez simplement un lecteur et commencez à diffuser dans votre XmlWriter. La seule partie qui peut être asynchrone est l'exécution initiale de la requête, une fois que les résultats commencent à revenir, votre callback se terminera et la lecture du SqlDataReader obtenu est une opération synchrone. Cela signifie qu'un thread est bloqué pendant toute la durée de la lecture du résultat et l'écriture du fichier XML, il n'y a tout simplement aucune API ADO.Net qui peut éviter ce problème. Vous avez raison de vous inquiéter de ce qui peut causer des problèmes (ce sera le cas) mais je dois demander: pourquoi votre système fait-il de gros téléchargements dans des fichiers XML? Voulez-vous sérialiser le résultat à une réponse HTTP?