Global.asax e sql

mercoledì 06 ottobre 2010 - 18.56
Tag Elenco Tags  .NET 2.0  |  SQL Server 2005

gsistemi Profilo | Junior Member

Ciao a tutti,

sto tentando di fare questa cosa senza sapere se è possibile o se è affidabile:

fino a ieri utilizzavo questa struttura per i miei siti che avevano bisogno di collegarsi a sql:

dim sqlconn = new sqlconnection( configurationsettings.appsettings("connessione") )
sub page_load( s as object, e as eventargs )
sqlconn.open
...istruzioni...
sqlconn.close
end sub

sub salva_click( s as object, e as eventargs ) handles salva.click
sqlconn.open
...istruzioni...
sqlconn.close
end sub

Questo in ogni pagina del sito, quindi ogni volta definisco la connessione e ogni volta la apro e la chiudo. Ovviamente ogni volta definisco anche l'sqlcommand, l'sqldatareader e tutto quello che mi serve per la pagina.

Da oggi sto provando così:

nel file global.asax ho definito tutte le variabili:
sub application_start( s as object, e as eventargs)

dim myconn as new sqlconnection( configurationsettings.appsettings("connessione") )
dim mycmd as sqlcommand
dim strsql as string
dim myreader as sqldatareader
dim mydataset as dataset

application("sqlconn") = myconn
application("sqlcmd") = mycmd
application("sqlreader") = myreader
application("dataset") = mydataset
application("strsql") = strsql

end sub

sub session_start( s as object, e as eventargs)
application("sqlconn").open
end sub

sub session_end( s As Object, e As EventArgs)
application("sqlconn").close
end sub

Funziona ma non sempre!!!
Vorrei sapere se è un approccio fattibile e corretto e se esiste un modo più semplice per definire le variabili globali senza dover ricorrere a application("variabile").

Spero di essere stato chiaro
Grazie Giulio.

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>Da oggi sto provando così:
>nel file global.asax ho definito tutte le variabili:
>Vorrei sapere se è un approccio fattibile e corretto e se esiste
>un modo più semplice per definire le variabili globali senza
>dover ricorrere a application("variabile").
in generale, per fare le cose per bene dovresti creare dei livelli fra quello che è la presentazione e il data layer. Di solito, un'applicazione dovrebbe avere almeno il livello di BLL (Business Layer) ed il DAL (Data Access Layer). La pagina ASP o l'applicazione WPF, Windows o altro, dovrebbe richiamare in poche istruzioni il livello BLL, che a sua volta possiede le logiche di comportamento da presentare sul Presentation Layer o da utilizzare per arrivare a db. il BLL poi, si occupa di richiamare i metodi del DAL, i quali, al loro interno hanno SEMPRE apertura della connessione, gestione del colloquio a db e chiusura della connessione. Considera che il web server (o chi gestisce il pool delle connessioni) pesca sempre un oggetto in memoria senza sprecarne, dove non serve. Quindi tu scrivi open e close mille volte, ma poi il processo di invocazione è ottimizzato sul web server, che non spreca risorse. Cosa che invece rischi di fare con il secondo metodo, infatti se non gestisci bene le dispose (usa sempre il costrutto USING http://msdn.microsoft.com/en-us/library/htd05whh(VS.80).aspx), in quel modo rischi di tenere appese le connessioni per molto più tempo. Invece col primo metodo avrai sempre controllo su ogni chiamata, che, di fatto risulta anche molto più snella e meno impegnativa su database.

>Grazie Giulio.
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

gsistemi Profilo | Junior Member

Ciao Alessandro,

grazie della risposta, immaginavo che tenere aperta la connessione per tutta la sessione non era un granchè, difatti sono tornato al vecchio metodo, non conosco molto BLL, DAL, ecc... ma credo di aver capito che la cosa che volevo fare era troppo cervellotica!

Per quanto riguarda il costrutto using e le dispose (non basta close?!?) puoi farmi un esempio di apertura/chiusura di una connessione sql e utilizzo di un sqldatareader evidenziando dove mettere using e dispose.

Grazie ancora... Giulio!

alx_81 Profilo | Guru

>grazie della risposta, immaginavo che tenere aperta la connessione
>per tutta la sessione non era un granchè, difatti sono tornato
>al vecchio metodo, non conosco molto BLL, DAL, ecc... ma credo
>di aver capito che la cosa che volevo fare era troppo cervellotica!
è molto semplice, sono due classi in più
una ha la chiamata effettiva al db (DAL), l'altra ha le logiche per cui arrivare alla chiamata (BLL), l'applicazione chiama la BLL, nulla più

>Per quanto riguarda il costrutto using e le dispose (non basta
>close?!?) puoi farmi un esempio di apertura/chiusura di una connessione
>sql e utilizzo di un sqldatareader evidenziando dove mettere
>using e dispose.
no, la close non basta. Se non fai dispose non si "libera" la memoria.
eccoti un esempio (C# però cambia poco, non ci sono le parentesi):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

gsistemi Profilo | Junior Member

Ciao,

non so se manca qualcosa nel codice che hai inviato perchè Dispose non c'è!!!

Comunque va fatto dispose dopo la close solo della connessione o anche dei command e reader?!?

Se faccio Dispose poi per riaprire la connessione o utilizzare lo stesso command o reader ci vuole più tempo?!?

CIAO!

alx_81 Profilo | Guru

>non so se manca qualcosa nel codice che hai inviato perchè Dispose non c'è!!!
leggi bene la doc, fa il dispose automatico, è comodo proprio per quello!!

>Comunque va fatto dispose dopo la close solo della connessione o anche dei command e reader?!?
qualunque oggetto che implementi la IDisposable è da "DISPOSARE"

>Se faccio Dispose poi per riaprire la connessione o utilizzare
>lo stesso command o reader ci vuole più tempo?!?
cambia nulla, tranquillo è la best practice
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

gsistemi Profilo | Junior Member

Ciao Alessandro,

sto usando il sistema che mi hai suggerito e in effetti funziona!!!!!!!

Ora ho un problema con questo codice mi da un errore:

protected function preleva_voci ( byval smenu as string, princi as string ) as dataview

using myconn = new sqlconnection( configurationsettings.appsettings("connessione") )

myconn.open()

strsql = "select gmenu.descri, gmenu.link, gmenu.sigla from gmenu where gmenu.princi = '" & princi & "' AND gmenu.smenu = '" & smenu & "'"

using myadapter = new sqldataadapter ( strsql, myconn )

using mydataset = new dataset

myadapter.fill( mydataset, "gmenu" )
return mydataset.tables(0).defaultview

end using
end using

end using

end function

L'errore è questo:

Risoluzione dell'overload non riuscita perché nessun 'New' accessibile può essere chiamato senza una conversione verso un tipo di dati più piccolo:

L'unica differenza che ho visto è che questa parte di codice è all'interno di una function anzichè di una sub

Riesco a risolverlo?!?

CIAO!!!

sankyu Profilo | Senior Member

Mi associo anch'io alla domanda, ma quando si usa un using tutte le risorse all'interno non vengono liberate in cascata? un po come quando istanzio una variabile all'interno di un ciclo o di un if che esiste solo dove l'ho creata e poi se ne va nel cestino in attesa del garbage collector.
Quindi è corretto mettere così tanti using?

Consulente e Sviluppatore .net in ambito finanziario
Dai un occhio al mio blog potrebbe tornarti utile
http://dotnetmemo.blogspot.com

alx_81 Profilo | Guru

>Risoluzione dell'overload non riuscita perché nessun 'New' accessibile
>può essere chiamato senza una conversione verso un tipo di dati
>più piccolo:
in che riga del codice hai l'errore? Oppure è esterno a questo metodo? Non vedo a prima vista errori..


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

alx_81 Profilo | Guru

>Mi associo anch'io alla domanda, ma quando si usa un using tutte
>le risorse all'interno non vengono liberate in cascata?
no, ogni using, rilascia la memoria degli oggetti in esso definiti (nella using puoi fare anche più di una istanza di oggetto).
Come sappiamo il Garbage Collector passa in modo non deterministico, e quindi sceglie il CLR quando "farlo passare". Con la using, permetti proprio la forzatura della chiamata al GC alla fine del costrutto using.

>Quindi è corretto mettere così tanti using?
Sì, decisamente. Anche perchè non è detto che tra uno using e l'altro esista solo l'istruzione di fine costrutto.
In generale, è proprio buona norma utilizzare la using quando l'oggetto implementa l'interfaccia IDisposable.
Anche quando scriviamo una classe nostra, se occupiamo memoria, dovremmo implementare quell'interfaccia, per far in modo di poter usare i nostri oggetti con using. Con la using riesci ad avere la "finezza" necessaria per gestire in maniera più precisa la memoria.

@gsistemi
usa le query parametriche, non concatenare, altrimenti sei soggetto ad attacchi di tipo sql injection.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

gsistemi Profilo | Junior Member

L'errore è su Using del dataadapter, la cosa che ho notato è che l'errore mi viene restituito solo se l'istruzione è all'interno di una function ( collegata ad un repeater con l'istruzione datasource ) e non in una sub.

Grazie!

alx_81 Profilo | Guru

>L'errore è su Using del dataadapter, la cosa che ho notato è
>che l'errore mi viene restituito solo se l'istruzione è all'interno
>di una function ( collegata ad un repeater con l'istruzione datasource
>) e non in una sub.
mi stai dicendo che se al posto di function metti sub va tutto? mi sembra strano..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5