2010-04-27 5 views
1

J'ai du mal à comprendre pourquoi le constructeur suivant ne ferme pas les connexions. Quand je regarde les connexions actives. Voici le code que j'ai..NET et fermeture des connexions SQL Server

Public Sub New(ByVal UserID As Integer) 

Dim oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("connStr").ToString()) 
Dim cmd As New SqlCommand("stored proc", oConn) 
Dim sdr As SqlDataReader 

cmd.CommandType = CommandType.StoredProcedure 
cmd.Parameters.AddWithValue("@userID", UserID) 
oConn.Open() 
sdr = cmd.ExecuteReader() 

Try 
    If Not sdr.HasRows Then 
     sdr.Close() 

     If Not oConn Is Nothing Then 
      If oConn.State <> ConnectionState.Closed Then 
       oConn.Close() 
      End If 
     End If 
     cmd.Dispose() 

     Exit Sub 
    End If 
    'User has account in WATS, proceed to load account information 
    While sdr.Read 
     _firstname = Convert.ToString(sdr("First Name")) 
     _lastname = Convert.ToString(sdr("Last Name")) 
    End While 

Catch ex As Exception 
    'Throw New Exception("User Error: " + ex.Message) 
Finally 
    sdr.Close() 

    If Not oConn Is Nothing Then 
     If oConn.State <> ConnectionState.Closed Then 
      oConn.Close() 
     End If 
    End If 
    cmd.Dispose() 
End Try 

End Sub 
+0

Il semble bien à première vue; comment déterminez-vous que cela ne ferme pas les connexions? Continuez-vous à voir de nouvelles connexions s'ouvrir dans SQL Server chaque fois que vous exécutez cette opération, ou voyez-vous simplement la connexion? – Aaronaught

+0

Tout d'abord, il est préférable de tirer parti de l'instruction 'Using' comme John le suggère ci-dessous. Deuxièmement, à cause de la façon dont vous avez organisé le code, il y a des fenêtres dans lesquelles vous avez alloué et ouvert la connexion, mais une exception peut survenir lorsque vous ne nettoyez pas la connexion. Par exemple, que se passe-t-il si 'sdr = cmd.ExecuteReader()' se déclenche? –

Répondre

2

Probablement ouvert en raison du regroupement de connexions.

ADO.NET Connection Pooling & SQLServer

+0

Il s'avère que c'est la mise en commun des connexions. Toutes les connexions sont en état de veille. J'ai besoin de jeter un coup d'oeil à la raison pour laquelle ce sproc est appelé tant de fois. Mais je pensais que si je transmettais les mêmes paramètres à la base de données, elle utiliserait la connexion groupée. Y a-t-il quelque chose que je suis en train de mal comprendre ou de mal faire? – kasabb

+0

Utilisez-vous la même chaîne de connexion? –

+0

Oui, tous les appels sont à la même DB utilisant la même connexion. – kasabb

2

Vous devez être mise en œuvre Using blocs. correction partielle:

Using oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("connStr").ToString()) 
    Using cmd As New SqlCommand("stored proc", oConn) 

     cmd.CommandType = CommandType.StoredProcedure 
     cmd.Parameters.AddWithValue("@userID", UserID) 
     oConn.Open() 
     Using sdr As SqlDataReader = cmd.ExecuteReader() 
     End Using 
    End Using 
End Using 
+0

Je mettrais en question le mot "besoin" parce que c'est une alternative à un itinéraire déjà partiellement pris dans la question avec Try Finally. –

+0

@jdk: la réponse est qu'il est beaucoup plus facile d'obtenir les blocs 'Using' que d'essayer/finalement. –

+0

S. Je suis d'accord avec Utilisation étant plus facile. –

1
Dim oConn As SqlConnection 
Dim cmd As SqlCommand 
Dim sdr As SqlDataReader 

Try 
    oConn = New SqlConnection(ConfigurationManager.ConnectionStrings("connStr").ToString()) 
    cmd = New SqlCommand("stored proc", oConn) 

    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.AddWithValue("@userID", UserID) 
    oConn.Open() 
    sdr = cmd.ExecuteReader() 
Catch ex As Exception 

Finally 

    If Not IsNothing(sdr) Then 
     If Not sdr.IsClosed Then sdr.Close() 
    End If 

    If Not IsNothing(oConn) Then 
     If oConn.State = ConnectionState.Open Then oConn.Close() 
    End If 

End Try 
Questions connexes