Al comando è già associato un DataReader aperto, che deve essere chius...

lunedì 04 maggio 2009 - 11.56

cok7sette Profilo | Newbie

Ho visto che questo problema ce l'hanno già avuti in molti ed ho anche trovato la soluzione:
Apro una nuova connection ad ogni esecuzione ed il problema si risolve da solo.


Il mio dubbio è legato alle prestazioni di un codice scritto in questa maniera.

Se ogni volta apro una connessione non mi ritroverò con un singlo client che mi apre, da solo, una decina di connessioni contemporanee?

Una volta che avrò 10 client cosa succede ad SQL server? (tra l'atro lavoro su SQL2000....)

Potessi almeno utilizzare una connessione "Predefinita"...


Mi sono creato una classe che "gestisce" i parametri di connessione al DB ed una dell eproprietà è proprio una system.data.sqlClient.sqlConnection, ma a questo punto diventa semplicemente inutile...

In questa"mia" classe ho anche aggiunto due Function che uso per eseguire comandi SQL e per valorizzare Datareader... (allego il codice)


Public Class clsDB
Dim m_sqlconnection As New System.Data.SqlClient.SqlConnection

Public Property DB_SqlConnection() As System.Data.SqlClient.SqlConnection
Get
DB_SqlConnection = m_sqlconnection
End Get
Set(ByVal value As System.Data.SqlClient.SqlConnection)
m_sqlconnection = value
End Set
End Property

Public Function ExecuteSqlCommand(ByVal strQuery As String) As Integer
Dim queryCommand As New System.Data.SqlClient.SqlCommand
Dim connection As New System.Data.SqlClient.SqlConnection

connection.ConnectionString = Me.DB_Connectionstring
connection.Open()
'POTESSI FARE ... connection = Me.DB_SqlConnection ... POTESSI, ma non si può fare....
queryCommand.CommandText = strQuery
queryCommand.Connection = connection
ExecuteSqlCommand = queryCommand.ExecuteNonQuery
queryCommand.Dispose()

End Function

Public Function ExecuteSqlDataReader(ByVal strquery As String) As System.Data.SqlClient.SqlDataReader
Dim connection As New System.Data.SqlClient.SqlConnection
Dim query As New System.Data.SqlClient.SqlCommand

connection.ConnectionString = Me.DB_Connectionstring
connection.Open()
'IDEM COME SOPRA
query.Connection = connection
query.CommandText = strquery
ExecuteSqlDataReader = query.ExecuteReader()
query.Dispose()

End Function

End Class

Solo che non sono del tutto convinto che questo sia il metodo migliore (e sopratutto l'unico) per eseguire in maniera performate comandi SQL...


Qualche suggerimento?

Stò sbagliando tutto o questa è "la via"?

Jok83 Profilo | Junior Member

Ciao non so se ho capito bene però se qui Me.DB_Connectionstring nella connectionstring hai la tua stringa di connessione ed è una variabile globale , non creare ogni volta una nuova connessione ma apri e CHIUDI quella:

Me.DB_Connectionstring.open
esegui i tuoi command
me.DB_connectionstring.close

attenzione che in caso di errore la devi chiudere cmq..e in teoria la puoi utilizzare più volte..

spero d'aver centrato cosa volevi..ciao

cok7sette Profilo | Newbie

Più o meno...

il problema è che pensavo di poter utilizzare quella variabile (ME.DB_SqlConnection) come connessione predefinita senza dorela chiudere ed aprire tutte le volte.

Probabilmente il tutto ragiona in maniera leggermente diversa da come credevo io, tutt lì, tant'è che credo che farò direttamente a meno di quella variabile aprendomi la connessione ogni volta che ne ho bisogno...

Tra l'altro se nel mio codice provi a a chiudere preventivamente la connessione semplicemente il tutto collassa. Mi spiego meglio

se nella funzione ExecuteSqlDataReader , alla fine metti un connection.close il datareader che dovrebbe essermi poi restituito mi risulta vuoto.

Oltre tutto il problema di base resta irrisolto.

il dover tutte le volte aprire e chiudere una connessione (quasliasi sia il modo in cui si vuole ragionare) non inficia un decremento delle prestazioni del tutto?

Sono nella fase iniziale dello sviluppo di un progetto che potrebbe diventare di dimensioni più che modeste e sto mettendo giù le classi "principali".

Semplicemente non vorrei ritrovarmi a dover ricambiare tutto il codice che poi starà "Sotto" al funzionamento i tutta l'applicazione.

E' vero che sbagliando s'impara, ma questa volte eviterei volentieri.

Spero di essere stato chiaro.

Grazie mille.


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