2008-11-13 15 views
2

problème Hangs très étrange que cela fonctionne parfaitement sur notre ancien site ASP classique. Nous interrogeons fondamentalement la base de données et exportons environ 2200 lignes de texte vers un fichier texte via Response.Write pour être sorties dans une boîte de dialogue et permettre à l'utilisateur de sauvegarder le fichier.Response.Write DataTable données dans un fichier texte, ASP.net

Response.Clear() Response.ClearContent() Response.ClearHeaders()

Dim fileName As String = "TECH" & test & ".txt" 

    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName)) 
    Response.ContentType = "text/plain" 

    Response.Write(strHeader) 

    Dim sw As New IO.StringWriter() 

    Dim dtRow As DataRow 
    For Each dtRow In dt3.Rows 
     sw.Write(dtRow.Item("RECORD") & vbCrLf) 
    Next 

    Response.Write(sw.ToString) 
    Response.Write(strTrailer & intRecCount) 
    Response.End() 

Je peux soit utiliser StringWriter ou simplement utiliser Response.Write (dt.Rows (i) .Item (» RECORD "). ToString

Dans tous les cas, l'exportation provoque un blocage horrible sur notre site de développement.Ma machine locale ne bloque pas et est presque instantanée.Le jeu d'enregistrements n'est pas très grand, et les lignes qu'il écrit sont petit

Quelqu'un at-il une idée de pourquoi cela serait suspendu? EVENTUELLEMENT permettre une sauvegarde et afficher le fichier, mais il est bien plus de 3-4 minutes.

Répondre

2

Attacher un débogueur distant et trouver où est suspendu?

Vous devez savoir si la boucle de son écrivain de chaîne, ou le code de la requête réelle (non fournie ici).

0

On dirait que vous êtes peut-être déborder le tampon de sortie. Peut-être ajouter un compteur là-bas pour rincer toutes les quelques centaines de lignes.

En outre, l'objet Response fait essentiellement la plupart des travaux pour un StringWriter pour vous. Utiliser le StringWriter en tant qu'intermédiaire est probablement redondant.

+0

Ne devrait pas Response.Write vider automatiquement le tampon? – FlySwat

+0

Vous penseriez cela, mais je l'ai vu arriver. Aussi: en lisant son code, il pousse tout en réponse dans une grande opération. –

0

Les deux utilisant StringWriter et DataTable sont trop puissantes.

Pourquoi ne pas utiliser directement SqlReader pour obtenir les résultats de la base de données, et en lisant le lecteur, écrire directement au flux de sortie? Beaucoup plus rapide, et beaucoup moins de mémoire consommée. En réponse à votre deuxième question - pourquoi l'ASP fonctionnait bien, je doute que vous ayez stocké le même contenu 3 fois en mémoire pour le sortir (dans le DataTable, dans le StringWriter et dans la sortie tampon). Mon ASP est un peu rouillé, mais je suppose que vous utilisez un lecteur de base de données quelconque. En outre, mieux utiliser une infrastructure de journalisation (NLog, log4net), de sorte que vous pouvez produire un peu de temps sur quelle opération retarde combien, au lieu d'attacher un débogueur distant.