VB .Net Connexion permanante à une base de donées - VB/VBA/VBS - Programmation
MarshPosté le 11-10-2005 à 08:35:55
Bonjour à tous,
Je suis actuellemetnt en train de concevoir une application sous VB .Net nececitant un accés aux données ( MS SQL server 2000).
Pour faciliter l'execution des requetes j'ai créé moi même un objet "SqlQueryObjet" qui se base sur un DataReader
La BD de mon application est aussi accessible via une interface web (où elle peut être modifiée) par concequant je ne peu utiliser qu'un mode CONNECTE à la BD afin que l'application soit capable de tenir compte des deernieres modifications.
Pour gagner du temps d'Execution je voudrais faire en sorte de connecter mon programme une seule fois à la BD et qu'il reste connecte tout au long de l'éxecution un peu comme un Mysqlpconnect() en PHP. . Tout se passe bien à la premiere requete mais c'est à partir de la seconde que je reçoit un message d'erreur:
Execute Reader requires an open and available connection. The connection current state is closed.
Alors que la premeire requete passe toujours tres bien et que je ne lui ai jamais di de fermer la connection mais de fermer le datareader !
Comment faire pour garder la connection ouverte aprés la fermeture du Datareader (si je ne ferme pas le datareader j'ai un message d'erreur "there is already an open datareader associated with this connection wich must be closed first" )
Il faut pourtant que je trouve un moyen de rester connecter à la BD car c'est beaucoup trop long de s'y connecter puis de s'en deconnecter avant et aprés chaque requétes mais là rerieusement je séche...
Voici mon code source
Public Class SqlQueryObject Private TR As Long Private CS As String
Public Function SqlRqst(ByVal request As String) As String()
Dim sqlcmd As New SqlClient.SqlCommand Dim reader As SqlClient.SqlDataReader
Dim reponses(0) As String Dim i As Integer
sqlcmd.CommandType = CommandType.Text sqlcmd.Connection = C 'PB ici a la deuxieme requete 'The SQL commend is currently Open, Busy, fetching sqlcmd.CommandText = request
Try 'Essayons d'executer la requete reader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection) Catch ex As Exception 'Oups ! MsgBox(request & Chr(10) & Chr(10) & ex.Message, MsgBoxStyle.Critical, "Database Error" ) End Try TR += 1 '//augmentation du compteur de requetes If reader.HasRows Then 'si il y a des resultats i = 0 While reader.Read() 'Tant qu'il y a des resultats ds le DataReader
reponses(UBound(reponses)) = reader(0)
ReDim Preserve reponses(UBound(reponses) + 1)
i += 1 End While End If Console.WriteLine("SQL: " & request) reader.Close() Return reponses End Function Public Function connect() C = New SqlClient.SqlConnection(CS)
C.Open() End Function
Public Function close() C.Close() End Function Public ReadOnly Property NumberOfRequests() Get Return TR End Get End Property Public Property ConnectString() As String Get Return CS End Get Set(ByVal Value As String) CS = Value End Set End Property End Class
Si quelqu'un sait comment contourner le probléme je suis preneur !
Marsh Posté le 11-10-2005 à 08:35:55
Bonjour à tous,
Je suis actuellemetnt en train de concevoir une application sous VB .Net nececitant un accés aux données ( MS SQL server 2000).
Pour faciliter l'execution des requetes j'ai créé moi même un objet "SqlQueryObjet" qui se base sur un DataReader
La BD de mon application est aussi accessible via une interface web (où elle peut être modifiée) par concequant je ne peu utiliser qu'un mode CONNECTE à la BD afin que l'application soit capable de tenir compte des deernieres modifications.
Pour gagner du temps d'Execution je voudrais faire en sorte de connecter mon programme une seule fois à la BD et qu'il reste connecte tout au long de l'éxecution un peu comme un Mysqlpconnect() en PHP.
.
Tout se passe bien à la premiere requete mais c'est à partir de la seconde que je reçoit un message d'erreur:
Execute Reader requires an open and available connection. The connection current state is closed.
Alors que la premeire requete passe toujours tres bien et que je ne lui ai jamais di de fermer la connection mais de fermer le datareader !
Comment faire pour garder la connection ouverte aprés la fermeture du Datareader (si je ne ferme pas le datareader j'ai un message d'erreur "there is already an open datareader associated with this connection wich must be closed first" )
Il faut pourtant que je trouve un moyen de rester connecter à la BD car c'est beaucoup trop long de s'y connecter puis de s'en deconnecter avant et aprés chaque requétes mais là rerieusement je séche...
Voici mon code source
Public Class SqlQueryObject
Private TR As Long
Private CS As String
Public Function SqlRqst(ByVal request As String) As String()
Dim sqlcmd As New SqlClient.SqlCommand
Dim reader As SqlClient.SqlDataReader
Dim reponses(0) As String
Dim i As Integer
sqlcmd.CommandType = CommandType.Text
sqlcmd.Connection = C 'PB ici a la deuxieme requete
'The SQL commend is currently Open, Busy, fetching
sqlcmd.CommandText = request
Try 'Essayons d'executer la requete
reader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection)
Catch ex As Exception 'Oups !
MsgBox(request & Chr(10) & Chr(10) & ex.Message, MsgBoxStyle.Critical, "Database Error" )
End Try
TR += 1 '//augmentation du compteur de requetes
If reader.HasRows Then 'si il y a des resultats
i = 0
While reader.Read() 'Tant qu'il y a des resultats ds le DataReader
reponses(UBound(reponses)) = reader(0)
ReDim Preserve reponses(UBound(reponses) + 1)
i += 1
End While
End If
Console.WriteLine("SQL: " & request)
reader.Close()
Return reponses
End Function
Public Function connect()
C = New SqlClient.SqlConnection(CS)
C.Open()
End Function
Public Function close()
C.Close()
End Function
Public ReadOnly Property NumberOfRequests()
Get
Return TR
End Get
End Property
Public Property ConnectString() As String
Get
Return CS
End Get
Set(ByVal Value As String)
CS = Value
End Set
End Property
End Class
Si quelqu'un sait comment contourner le probléme je suis preneur !
Merci d'avance