642 messaggi dal 08 aprile 2009
Devo eseguire una funzione sql che mi restituisce un campo di tipo XML.
Quando i dati letti sono molto va in outofexception memory.

Come posso risolvere?
186 messaggi dal 08 gennaio 2011
Ciao, io ho messo per esempio del codice html in dei campi di tipo varchar(max) senza avere problemi. Nel mio caso lo scopo è solo leggere e salvare codice xml (caratteri), non so se quest'approccio potrebbe fare anche al caso tuo.
642 messaggi dal 08 aprile 2009
Sono andata avanti e a quanto ho capito ogni volta che si inserisce un valore in un campo stringa viene eseguito il metodo System.IO.StringWriter che esegue il metodo System.Text.StringBuilder e con valori molto grandi si verifica l'eccezione System.OutOfMemoryException.

Praticamente eseguo una funzione SQL che mi restituisce un contenuto XML.
Prima lo leggevo con ExecuteScalar e mi dava l'errore OutOfMemoryException.
Poi leggendo la guida MSDN dice di utilizzare ExecuteReader per dati grandi come immagini e per contenuti XML si consiglia ExecuteXmlReader.
Il problema è sempre lo stesso perchè il reader non va più in eccezione ma ogni volta che tento di accedere al contenuto ho lo stesso problema:


in System.Text.StringBuilder.ToString()
in System.IO.StringWriter.ToString()
in System.Xml.XmlReader.ReadInnerXml()

Come posso fare?
10.286 messaggi dal 09 febbraio 2002
Contributi
Ciao Laura, dovresti rinunciare a caricare l'intero contenuto XML in memoria.
Supponiamo che l'XML contenga 1 milione di nodi che rappresentano altrettanti prodotti. Con ExecuteXmlReader avrai modo di leggere l'XML un nodo alla volta (cioè un prodotto alla volta), elaborarlo, e passare al successivo. In questo modo la memoria non sarà un problema perché stai di fatto leggendo pochi dati alla volta.

In cosa consiste l'elaborazione dell'XML? Devi riversare i dati da un'altra parte (es. in un tuo database?)

ciao,
Moreno

Enjoy learning and just keep making
642 messaggi dal 08 aprile 2009
No è il contrario...prendo i dati da un db per darlo in pasto ad un servizio.
Ho risolto scrivendo il reader in un file che poi tiro su un XmlDocument e lo do in pasto al servizio.
Purtroppo la logica di base l'ho ereditata e una singola funzione estrapola e genera un unico contenuto xml contenente anagrafiche clienti,articoli, teste documenti e righe documenti secondo un range di date e solo dati non presenti già nel portale di destinazione.
Il problema si pone la prima volta che si va a popolare il portale di destinazione e in un caso particolare di un cliente che estrapola sempre tutte le anagrafiche.
10.286 messaggi dal 09 febbraio 2002
Contributi

per darlo in pasto ad un servizio.

Ok, la soluzione con XmlDocument comunque ti costringe a caricare tutto in memoria. Se questo dovesse diventare un problema, potresti scrivere l'xml su file, e poi mandarlo in streaming al servizio che a sua volta lo scriverà su disco e lo leggerà con XmlReader. Ovviamente devi avere il controllo sul codice del webservice per realizzarlo.

Ecco delle informazioni sullo streaming con WCF.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/large-data-and-streaming

ciao,
Moreno

Enjoy learning and just keep making
642 messaggi dal 08 aprile 2009
Si il servizio di destinazione è sempre il nostro.
E' già in programma di riscrivere il servizio in quanto scritto utilizzando gli asmx e dobbiamo portare tutto con WCF.
Quindi prenderò in considerazione per questo metodo di ricevere uno streaming.

Intanto il tuo suggerimento mi ritorna molto utile in un altro servizio che stiamo scrivendo in WCF che riceve sempre contenuti XML e TXT :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.