Consiglio sulla gestione della connessione al db

venerdì 04 marzo 2011 - 12.08

trinity Profilo | Guru

Buongiorno a tutti,
vorrei chiedere un consiglio...io in una webform eseguo delle stored ora ovviamente devo aprire a monte la connessione al database, pertanto quale tra i due codici mi consigliate?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

oppure

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ovviamente se pensate che ci sia una soluzione migliore delle due postate accetto suggerimenti, ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Buongiorno a tutti,
ciao

>vorrei chiedere un consiglio...io in una webform eseguo delle
>stored ora ovviamente devo aprire a monte la connessione al database,
>pertanto quale tra i due codici mi consigliate?
la seconda, la sconsiglio proprio, hai il rischio di lasciare connessioni attive.
La prima è già meglio, ma io consiglio sempre di usare la using, dai una letta a questo link per il costrutto using:
http://msdn.microsoft.com/en-us/library/htd05whh(v=VS.90)#Y1700

l'obbiettivo è gestire in maniera ottimizzata la memoria, ed, in particolare, disallocare le risorse in modo corretto.
Nidificando gli oggetti puoi ottenere ciò che ti serve con poche using, leggibili e comode:

Using su connessione
open della connessione
Using su comando(connessione)
parametrizzazione e dichiarazione comando
Using su datareader
ciclo su datareader

>ciao e grazie
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

trinity Profilo | Guru

Scusami tanto se ti faccio questa domanda ma on sono molto pratico ancora...Te hai detto che tra i due codice che ho postato il primo è il migliore...Allora su tale codice dove dovrei applicare il blocco using? Solo nella connessione al db e poi nella sua chiusura oppure anche quando eseguo le due stored? Potresti farmi vedere un esempio semmai porprio utilizzando il mio codice così riuscirei a capire e focalizzare meglio ;)

e poi scusa lo using non fa la stessa cosa del dispose? Io per esempio utilizzo molto il dispose nei miei progetti windowsapplication


Grazie mille dell'aiuto

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Scusami tanto se ti faccio questa domanda ma on sono molto pratico
>ancora...Te hai detto che tra i due codice che ho postato il
>primo è il migliore...Allora su tale codice dove dovrei applicare
>il blocco using? Solo nella connessione al db e poi nella sua
>chiusura oppure anche quando eseguo le due stored? Potresti farmi
>vedere un esempio semmai porprio utilizzando il mio codice così
>riuscirei a capire e focalizzare meglio ;)
Ti ho rifattorizzato il primo blocco. Basati su quello per ripensare anche la parte sotto, e considera che per la seconda parte ti consiglio di usare TransactionScope (http://msdn.microsoft.com/it-it/library/system.transactions.transactionscope(v=vs.80).aspx):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>e poi scusa lo using non fa la stessa cosa del dispose? Io per
>esempio utilizzo molto il dispose nei miei progetti windowsapplication
fino all'avvento dello using sì, non potevi fare altro. Ma la using, non solo rende elegante e leggibile il codice, ma si occupa di capire quali oggetti implementano l'interfaccia per cui un oggetto deve essere disallocato. Inoltre, con la connessione verso database, la close è implicita. Quindi eviti dispose, clear, close della connessione. E non è poco. Ottimizza la gestione e "stimola" il garbage collector, evitando possibilità di memory leak. Anche i tuoi oggetti, se gestiscono memoria in maniera non trascurabile, dovrebbero implementare la IDisposable, in modo da poter utilizzare la using anche con essi.


--
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

trinity Profilo | Guru

Ma questo metodo e logica della using è solo ai fini web oppure è adatta meglio del dispose anche ai fini client con windowsapplication perchè io maggiormente programma software gestionali il web lo sto scoprendo ora per un lavoretto e per maggiore conoscenza. Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

trinity Profilo | Guru

> ' meglio mettere la connectionstring in una classe tua di proprietà
>statiche in modo da usare TuaConfigClass.ConnectionString
> ' Inoltre, la classe di config, dovrebbe andare a leggere il
>web.config, dove la stringa sarebbe protetta
>' db.ConnectionString = "Data Source=Zeus-vaio;Initial Catalog=liceo;Integrated
>Security=SSPI;"

Come faccio a puntare al webconfig?


> ' parametri: preferisci la AddWithValue che è il metodo recente
>che verrà introdotto come metodo indicato
> sqlcmd.Parameters.AddWithValue("@nomeutente", Me.TextBox1.Text)

Il metodo AddWithValue è un nuovo metodo introdotto in vs2008 e vs2010? Ma comunque potrei utilizzarlo anche in linguaggio vbnet quando creo software?


> Nome_Utente = sqlcmd.ExecuteScalar().Tostring()

ExecuteScalar è valido sempre ai fini della programmazione anche lato non web?


Scusa se ti faccio il 3° grado ma mi serve per capire e aggiornare la mia sintassi :D

>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Come faccio a puntare al webconfig?
Guarda qui:
http://pietschsoft.com/post/2005/12/28/ASPNET-20-How-to-get-a-specific-ConnectionString-from-the-WebConfig-by-name.aspx

>Il metodo AddWithValue è un nuovo metodo introdotto in vs2008
>e vs2010? Ma comunque potrei utilizzarlo anche in linguaggio
>vbnet quando creo software?
è presente dal framework 2.0 e quindi anche da 2005 (ma non conta il visual studio che usi, conta il framework con cui compili).
Cosa intendi con la seconda domanda? Certo che puoi, è un linguaggio che supporta quel metodo..

>ExecuteScalar è valido sempre ai fini della programmazione anche lato non web?
Certo, è ADO.net.. ti consiglio di leggere qualcosina a riguardo.. ADO.net è una libreria che serve per la connessione db, la usi dove ti serve non conta il tipo di progetto.

>Scusa se ti faccio il 3° grado ma mi serve per capire e aggiornare la mia sintassi :D
Credo sia importante che tu ti guardi per bene il linguaggio e le librerie disponibili, così per farti chiarezza in più..

--
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

trinity Profilo | Guru

Scusami toglimi a questo punto una curiosità....te hai scritto che lo using in pratica va a sostituire anche la funzione che svolge il dispose, clear e close...perfetto e forse è molto meglio come hai detto te perchè creare anche un ordine dal punto di vista del codice...però scusami se te la pongo anche se penso non riguardi il mondo web....Io sui progetti lato client.....avvio la connessione del db all'apertura della form principale e poi chiudo la connessione quando questa form verrà a sua volta chiusa....se io utilizzo lo using nella db.connection, quando chiudo la form principale e quindi l'intero programma non mi servirà più fare db.close, db.dispose, perchè a monte ci ha già pensato lo using? Oppure sbaglio?

Ti posso mandare una mail personale così da poterti spiegare meglio la mia situazione?

Ciao e grazie mille
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Io sui progetti lato client.....avvio la connessione del db all'apertura della form principale e poi
>chiudo la connessione quando questa form verrà a sua volta chiusa....se
>io utilizzo lo using nella db.connection, quando chiudo la form
>principale e quindi l'intero programma non mi servirà più fare
>db.close, db.dispose, perchè a monte ci ha già pensato lo using?
>Oppure sbaglio?
aprire la connessione a monte e chiuderla dentro non è a mio avviso una pratica da seguire.. mai.
Per me ogni chiamata deve istanziare il suo contesto. Pensa anche all'astrazione. Puoi farti una o n classi che gestiscono le chiamate e la form non si pone il problema di cosa faccia la chiamata se non quale sia l'eventuale ritorno ed i parametri da passare. La form, a mio avviso, la connessione non la deve proprio conoscere. E non aver paura, anche se chiami n connessioni, in realtà non istanzi n connessioni differenti, ma il framework con le sue librerie per la connettività, riusa quelle disponibili in un pool ottimizzato.

>Ti posso mandare una mail personale così da poterti spiegare meglio la mia situazione?
se non ne puoi parlare qui fai pure.
--
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

trinity Profilo | Guru

Nono tranquillo posso anche parlare qui anzi meglio così se altri hanno dei miei simili problemi o dubbi possono risolverli leggendo questo post....
allora facciamo così ti spiego brevemente....io di solito mi carico un modulo dove all'interno creo delle funzioni, che a loro volta eseguono stored, che mi richiamo nella varie form.......te mi stai dicendo che sarebbe meglio creare una classe di connessione al db e scriverla per esempio in questi moduli e poi me la devo utilizzare sempre quando dalla form mi richiamo la funzione (codice stopred) da eseguire......quindi se in una form ho diversi pulsanti che richiamano funzioni diverse e quindi stored diverse io ad ognuna prima applicherei la chiamata alla classe databaseconnection (esempio) ed utilizzando la using gestisco il tutto......quindi tante chiamte a n connessioni non rallentano nulla a livello di prestazione e velocità dell'applicativo...

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>te mi stai dicendo che sarebbe meglio creare una classe di connessione
>al db e scriverla per esempio in questi moduli e poi me la devo
>utilizzare sempre quando dalla form mi richiamo la funzione (codice
>stopred) da eseguire......quindi se in una form ho diversi pulsanti
>che richiamano funzioni diverse e quindi stored diverse io ad
>ognuna prima applicherei la chiamata alla classe databaseconnection
>(esempio) ed utilizzando la using gestisco il tutto......quindi
>tante chiamte a n connessioni non rallentano nulla a livello
>di prestazione e velocità dell'applicativo...
Allora, diciamo che dipende anche da:
- quanto vuoi astrarre
- quali sono i requisiti
- quanto "paga" il committente (perchè lo sviluppo è impegnativo in termini di tempo e risorse)

Una soluzione buona è dividere almeno il presentation layer (il tipo di applicazione che fai, web, win, wpf, servizio, ecc.) dal livello di accesso ai dati.
Poi, entrando nel dettaglio, sarebbe ottimo separare anche il livello delle logiche (cosiddette di business) da quello di accesso ai dati.
Ipotizza una classe in cui hai la connessione ed in ogni metodo vai a chiamare ad esempio una stored procedure. Quello lo chiamiamo DAL (Data access layer).
Poi una classe, che mappa il DAL, in cui ogni metodo effettua le logiche "aziendali" e poi chiama il DAL nei metodi che assolvono un requisito (BLL, Business Logic Layer).
Se vuoi la migliori con uno strato di interfacce per ogni classe.. E anche con classi in cui definisci i modelli tuoi (tuoi oggetti) che puoi chiamare MODEL
Infine il presentation, di qualunque natura sia, chiama solo la logica di biz e non si occupa di altro.
Altrimenti specializzi l'applicazione con il suo comportamento negando, di fatto, il riutilizzo di codice potenzialmente prezioso per altri progetti.
Ogni strato è un progetto di visual studio e ogni livello include quello che serve al suo contesto (ad esempio, l'applicazione punterà solo al BLL, il BLL solo al DAL, ecc.).
Spero di esser stato chiaro, è un discorso molto lungo da fare..
--
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

trinity Profilo | Guru

In pratica io ho sempre lavorato così:

- Creazione di stored su db sql
- Creazione di property al cui interno creo gli oggetti get....set
- Creazione di classi al cui interno vi sono le funzioni che richiamano le stored
- Poi a livello di form richiamare le classi che mi servono e riempirle con i valori derivanti da oggetti input (textbox ecc...)
- Poi per report o girglie ossia visualizzazioni dei dati utilizzo collection list....


Ovviamente cn vs2010 sono stati implementate alcune cosette e quindi ora devo riscrivere parte dei progetti per snellire il codice e migliorarlo....

Dal punto di vista del tempo di lavoro questo nel mio caso non è proprio fondamentale ossia è vero che ho dei tempi di scadenza ma si parla di progetti per enti pubblici quindi il tempo si ha e anche abbastanza...il discorso è che io mio al top delle prestazioni e delle velocità di elaborazione dei dati...Quindi scrivere il miglior codice e soprattutto codice che sia moderno e non vecchio di anni :)....

Te che ne pensi della logica che utilizzo? Dammi un tuo parere/consiglio :D

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>- Creazione di stored su db sql
questo è buono se usi sempre lo stesso db server, sql nella fattispecie immagino .
concordo con questo livello di astrazione. Ricordati sempre però che se devi cambiare db un sql non standard ti obbliga a rifattorizzare il tutto.. Ma è una possibilità rara e poi le stored procedure ti consentono una gestione della sicurezza di molto migliore ed infine, ma non per importanza, riducono il traffico di rete sulla chiamata (la stringa passata è più piccola spesso) e l'ottimizzazione sui piani di esecuzione che sql usa prendendoli dalla cache.

>- Creazione di property al cui interno creo gli oggetti get....set
dove?

>- Creazione di classi al cui interno vi sono le funzioni che richiamano le stored
per me questo è il DAL

>- Poi a livello di form richiamare le classi che mi servono e
>riempirle con i valori derivanti da oggetti input (textbox ecc...)
ti manca il livello biz, fai attenzione perchè se la medesima implementazione la dovrai fare sia su web che su windows che su un app per il cel rischi di dover replicare le logiche che hai "scolpito" nella form.

>- Poi per report o girglie ossia visualizzazioni dei dati utilizzo collection list....
Questa è modellazione, le liste usale dappertutto, anche per quello che le funzioni get tornano da database. Ed il modello (la classe "item") fallo in un file a parte o n file.

>Ovviamente cn vs2010 sono stati implementate alcune cosette e quindi ora devo riscrivere parte dei progetti per snellire il codice e migliorarlo....
è il framework installato che porta le differenze lato linguaggio, visual studio ti dà facility di gestione

>Dal punto di vista del tempo di lavoro questo nel mio caso non è proprio fondamentale ossia è vero che ho dei tempi di scadenza
>ma si parla di progetti per enti pubblici quindi il tempo si ha e anche abbastanza...il discorso è che io mio al top delle
>prestazioni e delle velocità di elaborazione dei dati...Quindi scrivere il miglior codice e soprattutto codice che sia moderno
>e non vecchio di anni :)....
non solo, anche ben ingenierizzato. I livelli di astrazione consentono molta facilità di release, deploy e manutenzione. Cose da non trascurare.
E credimi, che nell'ambiente dove lavoriamo le prestazioni sono NECESSARIE
Vedrai già con i costrutti Using, il codice sarà leggibile molto di più


--
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

trinity Profilo | Guru

>>- Creazione di stored su db sql
>questo è buono se usi sempre lo stesso db server, sql nella fattispecie
>immagino .
>concordo con questo livello di astrazione. Ricordati sempre però
>che se devi cambiare db un sql non standard ti obbliga a rifattorizzare
>il tutto.. Ma è una possibilità rara e poi le stored procedure
>ti consentono una gestione della sicurezza di molto migliore
>ed infine, ma non per importanza, riducono il traffico di rete
>sulla chiamata (la stringa passata è più piccola spesso) e l'ottimizzazione
>sui piani di esecuzione che sql usa prendendoli dalla cache.
>
>>- Creazione di property al cui interno creo gli oggetti get....set
>dove?

In questo senso per esempio:

Imports System.Collections Public Class PropertyAlb Private codalb, codcomune As Integer Private desc As String Public Property CodiceAlbergo() As Integer Get Return codalb End Get Set(ByVal value As Integer) codalb = value End Set End Property Public Property CodiceComune() As Integer Get Return codcomune End Get Set(ByVal value As Integer) codcomune = value End Set End Property Public Property Descrizione() As String Get Return desc End Get Set(ByVal value As String) desc = value End Set End Property End Class Public Class AlbCollection Inherits CollectionBase ' Aggiunge l'oggetto alla collection Public Sub Add(ByVal item As PropertyAlb) List.Add(item) End Sub ' Ritorna l'n-esimo elemento Public ReadOnly Property Item(ByVal index As Integer) As PropertyAlb Get Return CType(List(index), PropertyAlb) End Get End Property
End Class

Però sto leggendo un libro di vs2010 che la gestione del codice del Get...Set è migliorata pertanto devo riscriverla....

>>- Creazione di classi al cui interno vi sono le funzioni che richiamano le stored
>per me questo è il DAL

Data Access Layer?

ecco un esempio di classe che utilizzo:

Imports System.Data.SqlClient Public Class GestoreAlb Public Function CaricaRecord(ByVal ObjAlb As PropertyAlb) As PropertyAlb Dim OAlb As PropertyAlb = New PropertyAlb Try SqlCmd.CommandText = "GetAlb_new" SqlCmd.Parameters.Add("@CodAlb", SqlDbType.Int).Value = ObjAlb.CodiceAlbergo SqlCmd.Parameters.Add("@Codcomune", SqlDbType.Int).Value = ObjAlb.CodiceComune SqlCmd.Connection = db SqlCmd.CommandType = CommandType.StoredProcedure SqlDr = SqlCmd.ExecuteReader If SqlDr.Read() Then OAlb.Password = SqlDr.GetSqlString(22).Value End If Return OAlb Catch ex As Exception Throw ex Finally SqlDr.Close() SqlCmd.Parameters.Clear() SqlCmd.Dispose() End Try End Function End Class()

Ovviamente ora devo riscriverlo con la using e con la nuova gestione delle transazioni

>>- Poi a livello di form richiamare le classi che mi servono e
>>riempirle con i valori derivanti da oggetti input (textbox ecc...)
>ti manca il livello biz, fai attenzione perchè se la medesima
>implementazione la dovrai fare sia su web che su windows che
>su un app per il cel rischi di dover replicare le logiche che
>hai "scolpito" nella form.

In che senso mi manca la parte Biz?


>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Però sto leggendo un libro di vs2010 che la gestione del codice
>del Get...Set è migliorata pertanto devo riscriverla....
http://msdn.microsoft.com/en-us/library/dd293589.aspx
le auto implemented property.. se usassi C# le hai da molto tempo

>Data Access Layer?
>Ovviamente ora devo riscriverlo con la using e con la nuova gestione delle transazioni
esatto

sì alla fine hai fatto l'oggetto item del modello (il tuo PropertyAlb) e poi la classe con i metodi che lo tornano o che lo impostano via ado.net.

>In che senso mi manca la parte Biz?
una classe che prima di chiamare la classe che va su db esegue le logiche per arrivare ad effettuare la particolare chiamata.
Questo ti consente di non legare nessuna logica all'applicazione. E puoi consumare le stesse dll per ogni tipo di front end che decidi di implementare. Capito?

--
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

trinity Profilo | Guru

>>In che senso mi manca la parte Biz?
>una classe che prima di chiamare la classe che va su db esegue
>le logiche per arrivare ad effettuare la particolare chiamata.
>Questo ti consente di non legare nessuna logica all'applicazione.
>E puoi consumare le stesse dll per ogni tipo di front end che
>decidi di implementare. Capito?

Ho capito la tua logica ed è effettivamente giusta e te per biz layer intendi utilizzare una list of che poi la passo come source alle grid oppure ai report e così via e queste list of le popolo con i record che mi ritornano dal executereader?

>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Ho capito la tua logica ed è effettivamente giusta e te per biz
>layer intendi utilizzare una list of che poi la passo come source
>alle grid oppure ai report e così via e queste list of le popolo
>con i record che mi ritornano dal executereader?
no, intendo proprio una classe che mappa le chiamate del dal. Le logiche da fare appena prima della chiamata (gli if, le considerazioni, ecc.) le faccio prima di andare sul dal
--
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

trinity Profilo | Guru

Ah ma io le varie condizioni se ci sono e controllo di errore se sono lunghe di codice gli creo una classe se invece è tipo poche righe di codice la scrivo nell'oggetto che deve eseguire il controllo e basta.....

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Ah ma io le varie condizioni se ci sono e controllo di errore
>se sono lunghe di codice gli creo una classe se invece è tipo
>poche righe di codice la scrivo nell'oggetto che deve eseguire
>il controllo e basta.....
ma nel progetto dell'applicazione? perche per me ogni livello è un progetto a parte eh..
--
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

trinity Profilo | Guru

ma Io per progetto intendo tutto dalla sviluppo e creazione del db e delle stored alla loro analisi e alla creazione grafica e di codice delle varie form dell'eseguibile

senti scusa piccola parentesi ma per gestire la visualizzazione dei un messaggio di controllo come sono le messagebox per intenderci in web come devo fare perchè alcuni codice che sto provando non funzionano per niente oppure il messaggio resta in background....tanto questi messaggi vanno eseguiti sull'evento click dei button alle fine

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>ma Io per progetto intendo tutto dalla sviluppo e creazione del
>db e delle stored alla loro analisi e alla creazione grafica
>e di codice delle varie form dell'eseguibile
scusami, ho dato per scontato che il progetto è di Visual Studio. Personalmente faccio un progetto per ogni tipo di livello.

>senti scusa piccola parentesi ma per gestire la visualizzazione
>dei un messaggio di controllo come sono le messagebox per intenderci
>in web come devo fare perchè alcuni codice che sto provando non
>funzionano per niente oppure il messaggio resta in background....tanto
>questi messaggi vanno eseguiti sull'evento click dei button alle fine
dipende se i messaggi ti servono lato serve o client. Se li vuoi sui bottoni devi scrivere javascript.
--
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

trinity Profilo | Guru

>>ma Io per progetto intendo tutto dalla sviluppo e creazione del
>>db e delle stored alla loro analisi e alla creazione grafica
>>e di codice delle varie form dell'eseguibile
>scusami, ho dato per scontato che il progetto è di Visual Studio.
>Personalmente faccio un progetto per ogni tipo di livello.
Cosa intendi per visual studio, i miei progetti li scrivo e realizzo con il linguaggio vb di visual studio...
>>senti scusa piccola parentesi ma per gestire la visualizzazione
>>dei un messaggio di controllo come sono le messagebox per intenderci
>>in web come devo fare perchè alcuni codice che sto provando non
>>funzionano per niente oppure il messaggio resta in background....tanto
>>questi messaggi vanno eseguiti sull'evento click dei button alle fine
>dipende se i messaggi ti servono lato serve o client. Se li vuoi
>sui bottoni devi scrivere javascript.
Si i messaggi devono apparire all'utente quando sta effettuando una registrazione o accesso attraverso una pagina web di un sito, pagina web da me creata.
>--
>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Cosa intendi per visual studio, i miei progetti li scrivo e realizzo
>con il linguaggio vb di visual studio...
volevo solo sottolineare che quando dico un progetto per ogni livello, intendo che per ogni livello di astrazione faccio un progetto in visual studio, come il progetto DAL, il progetto BLL, il progetto MODEL, e il presentation

>Si i messaggi devono apparire all'utente quando sta effettuando
>una registrazione o accesso attraverso una pagina web di un sito,
>pagina web da me creata.
ok, se devono apparire lato client puoi usare div modali, alert di javascript, ecc..
se ti servono sul server devi renderizzare l'html alla postback.
--
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

trinity Profilo | Guru

Prima di tutto ho riscritto il DAL con la using mi puoi dire se va bene?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>ok, se devono apparire lato client puoi usare div modali, alert
>di javascript, ecc..

come puoi vedere dal codice postato per i messaggi utilizzo un codice javascript che in alcuni casi ossia in certe parti del codice funziona alla grande in questo caso per esempio non funziona...Te hai un codice migliore o potresti dirmi perchè non va?

Inoltre per la connessione al db attraverso il webcofig c'è qualcosa che non va perchè non si connette.
In pratica ecco il codice nel webconfig:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ed ecco il codice di connessione:

Dim conString = ConfigurationManager.ConnectionStrings("LocalSqlServer") Dim strConnString As String = conString.ConnectionString Dim db As New SqlConnection(strConnString) db.Open()

se eseguo il debug sulla stringa mi esce questa connessione:

{data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true}

ed ovviamente non si connette io pc ho sql server full non express se questo può essere di aiuto...Dove sbaglio?

Ciao e grazie

>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Prima di tutto ho riscritto il DAL con la using mi puoi dire se va bene?
ok, mi piace

>come puoi vedere dal codice postato per i messaggi utilizzo un
>codice javascript che in alcuni casi ossia in certe parti del
>codice funziona alla grande in questo caso per esempio non funziona...Te
>hai un codice migliore o potresti dirmi perchè non va?
secondo me viene eseguita prima la redirect della finally e quindi il processo si mangia l'esecuzione client dello script..


>ed ovviamente non si connette io pc ho sql server full non express
>se questo può essere di aiuto...Dove sbaglio?
stai puntando ad una stringa di connessione che non vedo nel tuo codice .config. Tra parentesi ci vuole il nome della connection string effettivamente indicato, e quindi per te liceoConnectionString.
--
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

trinity Profilo | Guru

>>come puoi vedere dal codice postato per i messaggi utilizzo un
>>codice javascript che in alcuni casi ossia in certe parti del
>>codice funziona alla grande in questo caso per esempio non funziona...Te
>>hai un codice migliore o potresti dirmi perchè non va?
>secondo me viene eseguita prima la redirect della finally e quindi
>il processo si mangia l'esecuzione client dello script..

Per capire dove non va lo script del messaggio ho disabilitato il parametro idnotizia

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma sto notando che come ho impostato il try il codice genera l'errore quando esegue l'ExecuteNonQuery ma non passa per i catch..si ferma lì ovviamente generando la pagina di errore dell'asp....Come mai? Dovrei a questo punto gestire vari try...catch nelle varie using che ho creato? Mi sembra strano però.

>>ed ovviamente non si connette io pc ho sql server full non express
>>se questo può essere di aiuto...Dove sbaglio?
>stai puntando ad una stringa di connessione che non vedo nel
>tuo codice .config. Tra parentesi ci vuole il nome della connection
>string effettivamente indicato, e quindi per te liceoConnectionString.

Funziona grazie...senti allora mi dici che anche su applicazioni windows ossia su codice scritto in vb che gira su lato client (windows) mi consigli ed è meglio aprire la connessione al db quando devo eseguire una stored e poi chiuderla subito dopo? Quindi non devo più adottare il mio metodo che aprivo il db all'inzio della form iniziale del mio programma e poi chiudere lo stesso db solo quando veniva chiusa la stessa form

Ciao
>--
>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

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>ma sto notando che come ho impostato il try il codice genera
>l'errore quando esegue l'ExecuteNonQuery ma non passa per i catch..si
>ferma lì ovviamente generando la pagina di errore dell'asp....Come
>mai? Dovrei a questo punto gestire vari try...catch nelle varie
>using che ho creato? Mi sembra strano però.
se non trappi l'eccezione generica (Exception) oppure la SQLException non catcherai mai

>Funziona grazie...senti allora mi dici che anche su applicazioni
>windows ossia su codice scritto in vb che gira su lato client
>(windows) mi consigli ed è meglio aprire la connessione al db
>quando devo eseguire una stored e poi chiuderla subito dopo?
sicuro, sempre a mio avviso.. a meno che non ti serva una connessione aperta per più di quel particolare statement

>Quindi non devo più adottare il mio metodo che aprivo il db all'inzio
>della form iniziale del mio programma e poi chiudere lo stesso
>db solo quando veniva chiusa la stessa form
no, semplicemente perchè rischi di lasciare appese connessioni, e se il db è su di un server, pensa anche solo chi vuole cambiare le risorse appese sul client che blocca..
meno tieni connessione meglio è.


--
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

trinity Profilo | Guru

Ho sistemato il codice try ma continua a non apparire il messaggio di errore se si verifica..con il debug il codice delle script viene eseguito ma non si visualizza..eppure in altre webform funziona....

ecco il codice:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


non centra nulla che in questa webform l'area di input dati si trova all'interno di un updatepanel?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>non centra nulla che in questa webform l'area di input dati si
>trova all'interno di un updatepanel?
al di là del fatto che non so cosa si inventi lo script manager dell'updatepanel, torno a dire che non è buona norma, a mio avviso, lanciare script client dal server in quel modo.
Ritengo molto migliore fare una chiamata ajax a quel metodo, e, nella callback, gestire l'errore sul client.
--
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

trinity Profilo | Guru

>>non centra nulla che in questa webform l'area di input dati si
>>trova all'interno di un updatepanel?
>al di là del fatto che non so cosa si inventi lo script manager
>dell'updatepanel, torno a dire che non è buona norma, a mio avviso,
>lanciare script client dal server in quel modo.
>Ritengo molto migliore fare una chiamata ajax a quel metodo,
>e, nella callback, gestire l'errore sul client.

in che senso fare la chiamata con ajax.....

senti un piccola info, nei post precedenti mi dicevi che quando eseguo una query di select e so che il record selezionato sarà uno devo utilizzare il sqlcmd.ExecuteScalar().Tostring() ossia intendi direttamente:

nome_campo=sqlcmd.ExecuteScalar().Tostring()?

ma se i campi sono più di uno? ossia per esempio

codice
descrizione
città

ma il record selezionato è uno come devo procedere?

io facevo così di solito:

..... SqlDr = SqlCmd.ExecuteReader If SqlDr.Read() Then OAlb.CodiceAlbergo = SqlDr.GetSqlInt32(0).Value OAlb.Descrizione = SqlDr.GetSqlString(1).Value OAlb.CittaAlb = SqlDr.GetSqlString(4).Value End If ..... dove sqldr è il datareader... se poi i record sono più di uno utilizzavo questo: SqlDr = SqlCmd.ExecuteReader While SqlDr.Read ObjAlb = New PropertyAlb ObjAlb.CodiceAlbergo = SqlDr.GetSqlInt32(0).Value ObjAlb.Descrizione = SqlDr.GetSqlString(1).Value ObjAlb.CittaAlb = SqlDr.GetSqlString(4).Value AlbColl.Add(ObjAlb) End While

Ora applicando il tutto con la using? gestisco sempre come ho scritto oppure il codice devo modificarlo?

Puoi darmi un consiglio?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

> in che senso fare la chiamata con ajax.....
usare le chiamate asincrone dal client verso il server e non imporre al server di renderizzare un alert.
Ad esempio, usando jquery hai il metodo post:
http://api.jquery.com/jQuery.post/

ma usciamo dallo scope del post, cerchiamo di chiudere questo che diventa fuorviante per chi legge il titolo

>senti un piccola info, nei post precedenti mi dicevi che quando
>eseguo una query di select e so che il record selezionato sarà
>uno devo utilizzare il sqlcmd.ExecuteScalar().Tostring() ossia
>intendi direttamente:
>nome_campo=sqlcmd.ExecuteScalar().Tostring()?
si quando il record è uno, ma la colonna che ti serve è solo una.. altrimenti ti serve il reader comunque. Se ti serve solo un campo, ExecuteScalar, che, tornando oggetto va castato nel tipo che ti serve. Se è stringa, ok come hai fatto tu.

>ma se i campi sono più di uno? ossia per esempio
reader, appunto.. non esiste una ExecuteTop1

>Ora applicando il tutto con la using? gestisco sempre come ho scritto oppure il codice devo modificarlo?
la using rende disposabili in automatico gli oggetti, vai tranquillo che non rompi niente
cerca di leggere con attenzione la documentazione sulla using, e vedrai che ti tranquillizzi
Ti chiedo cortesemente, se ti è stata di aiuto, di chiudere il thread accettando la risposta, poi aprine pure un altro per la chiamata ajax ad esempio
grazie
--
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

trinity Profilo | Guru

Perfetto....trovo in rete degli esempi con il reader ed using?

cmq grazie si aprirò sicuramente qualcosa con ajax ;)
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Perfetto....trovo in rete degli esempi con il reader ed using?
guarda qui:
http://www.codeproject.com/KB/cs/tinguusingstatement.aspx
--
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5