11 messaggi dal 02 agosto 2004
Ciao a tutti.

Ho scritto una web application in ASP.NET 4.0 (c#) che si interfaccia con Microsoft SQL Server 2005 attraverso ADO.NET, in particolare usando data adapter tipizzati.
Ecco per esempio la procedura di caricamente di un utente (parte della procedura di autenticazione):

public static APUser LoadUser(string username) {

APUser user = null;

TUtentiTableAdapter da = null;
TablesDataSet.TUtentiDataTable dt = null;
try {
da = new TUtentiTableAdapter();
dt = da.GetDataByUsername(username);
if (dt.Rows.Count > 0) {
user = new APUser(dt.Operatore,dt.Password, dt.Livello, dt.Nominativo);
}
} finally {
if (da != null) {
da.Dispose();
}
if (dt != null) {
dt.Dispose();
}
}

return user;
}

Dopo qualche ora o qualche giorno o qualche minuto di utilizzo l'applicazione inizia a non funzionare correttamente, non consento il login agli utenti, perchè la riga

dt = da.GetDataByUsername(username);

ritorna sempre ZERO righe, anche se certamente lo username esiste in archivio (verificato attentamente tramite debug).

Faccio notare che la tabelle TUtenti è veramente semplice, con Username, Password, Livello e Nominativo dell'utente. La classe APUser incapsula tali dati.

Il comportamento descritto per la procedura di login si verifica anche in altre query, con altri table adapter e sempre "casualmente".

Fermando e riavviando l'applicazione web tutto torna a funzionare regolarmente.

Ho anche sostituito l'uso dei table adapter tipizzati con un data adapter generico ed il problema è rimasto.

Nessuna eccezione viene sollevata e dunque non so darvi dati ulteriori sullo scenario descritto.

Il carico di lavoro è stimato in 50 utenti (per l'applicazione web), ma il problema sembra non essere legato a questo dato perchè si presenta anche in situazioni con solo tre utenti connessi.

La web application gira sotto IIS 6.0 su Windows Server 2003 standard edition, tutti regolarmente patchati.

Vi ringrazio.
Stefano Bonnini

Stefano Bonnini
ci metterei un bel catch, oltre al finally, che magari logghi l'eventuale eccezione. solo in questo modo sarà possibile capirci qualcosa...

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
11 messaggi dal 02 agosto 2004
Il catch non sta in questo metodo perchè lascio che l'eccezione venga trasmessa al metodo chiamante, dove appunto si constata che .... non c'è eccezione sollevata!!!

Stefano Bonnini
11 messaggi dal 02 agosto 2004
In aggiunta quanto detto mi riporto l'esito di un debug fatto giusto ieri, quando "per caso" mi è accaduto il comportamento descritto mentre stavo debuggando tutt'altro.
Quando ho eseguito, con F10 per intenderci, la riga in cui il TableAdapter tipizzato mi deve tornare i dati dell'utente, mi sono accorto che aveva tornato ZERO righe, quando invece l'utente cercato era assolutamente presente nella tabella TUtenti. Ho "riportato indietro" il punto di esecuzione per fargli rifare la query e così ho scoperto che il record ora era stato correttamente individuato!!!
Può esserci qualche proprietà, che ovviamente non conosco, da usare per garantire "un corretto comportamento" di un table adapter?
Mi son chiesto se poteva essere utile impostare il ClearBeforeFill, ma ho visto che tale proprietà è sempre correttamente impostata nel costruttore del TableAdapter, dunque sarebbe inutile impostarla di nuovo.

Stefano Bonnini
Quaclhe informazione in più sul codice richiamato?

TUtentiTableAdapter

GetDataByUsername(username);

Ormai programmano tutti... ma la professionalità appartiene a pochi
46 messaggi dal 25 febbraio 2002
il comando arriva a SQL? controlla con Profiler.
ciao
11 messaggi dal 02 agosto 2004
manuel0081 ha scritto:
Quaclhe informazione in più sul codice richiamato?
TUtentiTableAdapter
GetDataByUsername(username);


Nel db esiste la tabella TUtenti con la seguente struttura:
Operatore nvarchar(50) not null (primary key)
Password nvarchar(50) not null
Livello int not null
Nominativo nvarchar(250) not null

Il TUtentiTableAdapter è stato generato da Visual Studio 2010 dopo che nel data set ho inserito la tabella TUtenti.
Il metodo GetDataByUsername(username) richiama la stored procedure seguente:


CREATE PROCEDURE [P_TUtenti__GetBy_Operatore]
(
@Operatore nvarchar(50)
)
AS
BEGIN
SET NOCOUNT ON;
SELECT Operatore, Password, Livello, Nominativo
FROM TUtenti
WHERE (Operatore = @Operatore)
END

Stefano Bonnini
11 messaggi dal 02 agosto 2004
mpolleschi ha scritto:
il comando arriva a SQL? controlla con Profiler.
ciao


Effettivamente non ho fatto questa verifica ... appena ho qualche risultato in merito vi aggiorno.

Stefano Bonnini

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.