5 messaggi dal 08 marzo 2006
Ciao a tutti, ho un grosso problema!
Ho una classe che mi gestisce l'accesso alle varie tabelle, le select - update - insert ecc. specifiche per la mia applicazione e la gestione del formato dei dati nelle colonne.

Nella mia pagina asp, la prima volta, instazio la classe e poi la metto in sessione. Le volte successive prendo la classe dalla sessione.

E' andato tutto bene finchè ho aggiunto la lettura di una tabella che può avere dei null (nella colonna di tipo int).
Quando eseguo la GetInt() del campo nullo va nel catch (e fin qui tutto ok)

public int GetInt(string FieldName)
{
try
{
System.Data.DataTable tab = m_DataSet.Tables[this.m_TableName];
System.Data.DataRow row=tab.Rows[m_CurrentRow];
return(System.Convert.ToInt32(row[FieldName]));
}
catch(Exception err)
{
ExceptionsLog log= new ExceptionsLog(this);
m_LastError=log.WriteLog("GetInt",err.Message);
return(0);
}
}

Il problema è che quando viene ricaricata la pagina in sessione non c'è più l'istanza della classe!!!! Non c'è nemmeno la key!!!!

Finchè non viene ricaricata la pagina cmq l'oggetto c'è, è istanziato, valorizzato correttamente e la key in sessione c'è.
mumble mumble,

scusa maaaaa, ha senso mettere l'istanza di una classe in sessione ?

Forse mi sfugge qualcosa, potresi chiarie meglio cio che vuoi fare.

Ciao,

Fabrizio

Fabrizio Canevali
5 messaggi dal 08 marzo 2006
La classe nel costruttore crea i vari dataSet e dataAdapter delle tabelle (e porta via un po' di tempo...)
In più mi serve mantenere in memoria i dati letti da db perchè l'utente può modificarne alcuni e richiedere l'inserimento di una nuova riga con i dati vecchi + quelli modificati.
Poi, alcuni valori associati a delle combo che possono variare gli items a seconda di quello che è stato selezionato in un'altra combo (e tutte le informazioni sui legami delle combo vengono lette da db e memorizzate in un arrayList di questa classe)

Comunque prima di aggiungere il pezzo che va in eccezione (gestita) ho fatto un sacco di prove e l'oggetto veniva memorizzato correttamente in sessione.
Quello che mi sconvolge di più è che in sessione adesso non esiste più nemmeno la key!
5 messaggi dal 08 marzo 2006
Ho fatto altri test.
Il problema lo causa la scrittura del log, più precisamente il metodo incriminato è log.WriteLog("GetInt",err.Message).

La classe che scrive il log, scrive gli errori in un file xml che deserializza nel costruttore, e serializza in scrittura.
(il file contiene un int con l'indice del prossimo errore, la struttura con i dati dell'errore ripetuta 20 volte --> restano tracciati solo gli ultimi 20 errori)

public string WriteLog(string methodName,string errorDescription)
{
if(m_NextError >= m_NumTotalErrors)
m_NextError=0;

if(m_ListError[m_NextError]==null)
m_ListError[m_NextError]= new ExceptionsError();

((ExceptionsError)m_ListError[m_NextError]).Index=m_NextError;
((ExceptionsError)m_ListError[m_NextError]).DateTime = System.DateTime.Now;
((ExceptionsError)m_ListError[m_NextError]).ApplicationName=m_GenericDataManager.ApplicationName;
((ExceptionsError)m_ListError[m_NextError]).TableName=m_GenericDataManager.TableName;
((ExceptionsError)m_ListError[m_NextError]).MethodName=methodName;
((ExceptionsError)m_ListError[m_NextError]).ErrorDescription=errorDescription;
m_NextError++;
XMLSave();
return(errorDescription);
}

private void XMLSave()
{
XmlSerializer serializer = new XmlSerializer(typeof(ExceptionsLog));
Stream fs = new FileStream(m_LogFile, FileMode.Create);
XmlWriter writer = new XmlTextWriter(fs, new UTF8Encoding());
serializer.Serialize(writer, this);
writer.Close();
}

L'XMLSave scrive il file, la variabile in sessione viene messa dopo e finchè non viene rieseguita la pagina in sessione c'è, ma dopo si perde.
Ho provato anche ad eseguire solo la new dell'XmlSerializer e va tutto ok, quindi le righe di codice che danno problemi sono:
Stream fs = new FileStream(m_LogFile, FileMode.Create);
XmlWriter writer = new XmlTextWriter(fs, new UTF8Encoding());
serializer.Serialize(writer, this);
writer.Close();


Prima di istanziare la classe che usa l'ExceptionLog, setto la directory di lavoro :

System.IO.Directory.SetCurrentDirectory(this.Request.PhysicalApplicationPath+"bin\\");

A questa dir da esplora-risorse ho aggiunto nelle proprietà l'utente ASP.NET dandogli le autorizzazioni di lettura/scrittura/modifica


Ciao e grazie

Mary

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.