Se connecter a access et retourner dateset

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 480 fois - Téléchargée 31 fois

Contenu du snippet

Permet de se connecter a une base de donnee access, de retourner un dataset ou un datareader. Ceci est une class

Source / Exemple :


Public Class Connection

    Private MyConnection As OleDbConnection

    Public Function OpenConnection(ByVal MyConn As OleDbConnection) As OleDbConnection
        '///<summary>
        'Permet d'ouvrir la connection
        '///</summary>

        Dim MyDsConfig As New DataSet

        MyConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & Chemin_Base_De_Donnee

        Try

            MyConn.Open()  'ouverture de la connection

            If MyConn.State = ConnectionState.Open Then
                Return MyConn
            End If

        Catch ex As Exception 'probleme à l'ouverture de la connection, le probleme peut venir du chemin ConnectionString
            MsgBox("Probléme d'ouverture de la connection" & vbCrLf & ex.Source & " " & ex.Message)
        End Try

    End Function

    Public Function ClosedConnection(ByVal MyConn As OleDbConnection) As OleDbConnection
        '///<summary>
        'Permet de fermer la connection
        '///</summary>

        If MyConn.State = ConnectionState.Open Then 'Si la connection est ouverte

            Try

                MyConn.Close()  'On ferme la connection

            Catch ex As Exception  'Probleme lors de la fermeture de la connection
                MsgBox("Probléme de fermeture de la connection" & vbCrLf & ex.Source & " " & ex.Message)
            End Try

        End If

    End Function

    Public Function RenvoieDS(ByVal Requete As String) As DataSet
        '///<summary>
        'Permet de remplir un dataset grâce à une requete, sert pour les SELECT
        '///</summary>

        Try

            MyConnection = New OleDbConnection 'Declaration d'une nouvelle connection

            If Me.OpenConnection(MyConnection).State = ConnectionState.Open Then 'on verifie que la connection soit ouverte

                Dim MyAdapter As New OleDbDataAdapter 'declaration d'un nouveau OledbDataAdapter
                Dim MyDs As New DataSet 'declaration d'un dataset
                MyAdapter.SelectCommand = New OleDbCommand(Requete, MyConnection) 'on passe le selectcommand dataadapter
                MyAdapter.Fill(MyDs) 'on remplit le dataset
                Me.ClosedConnection(MyConnection) 'on ferme la connection
                Return MyDs 'on retourne le dataset

            End If

        Catch ex As Exception
            MsgBox(ex.Message & " " & ex.Source)
        End Try

    End Function

    Public Function Remplir_DataReader(ByVal Requete As String) As OleDbDataReader
        '///<summary>
        'Permet de remplir un DataReader grâce à une requete, sert pour les SELECT
        '///</summary>

        Try

            MyConnection = New OleDbConnection 'Declaration d'une nouvelle connection

            If Me.OpenConnection(MyConnection).State = ConnectionState.Open Then 'on verifie que la connection soit ouverte

                Dim myCommand As New OleDbCommand(Requete, MyConnection) 'Declaration du commande
                Dim myReader As OleDbDataReader 'Declaration du datareader
                myReader = myCommand.ExecuteReader() 'Liaison du datareader avec la commande
                'Me.ClosedConnection(MyConnection) 'on ferme la connection
                Return myReader 'on retourne le datareader

            End If

        Catch ex As Exception
            MsgBox(ex.Message & " " & ex.Source)
        End Try

    End Function

    Public Function ExecuteRequete(ByVal Requete As String) As Integer
        '///<summary>
        'sub permettant de faire un insert, update et delete
        'elle renvoie le nombre de ligne ce qui permet de savoir si ça s'est bien passé
        '///</summary>

        Try

            Dim MyConnection As New OleDbConnection 'declaration d'une nouvelle connection
            Dim MyOleCommand As OleDbCommand 'declaration d'une nouvelle commande

            If Me.OpenConnection(MyConnection).State = ConnectionState.Open Then 'si la connection est ouverte

                MyOleCommand = New OleDbCommand(Requete, MyConnection) 'je passe les parametres a ma command
                Dim Resultat As Integer = MyOleCommand.ExecuteNonQuery() 'j'execute la requete
                Me.ClosedConnection(MyConnection) 'je ferme la connection

                Return Resultat

            End If

        Catch ex As Exception 'probleme d'execution de la requete
            MsgBox(ex.Message & " " & ex.Source)
        End Try

    End Function

End Class

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
mardi 23 mai 2006
Statut
Membre
Dernière intervention
15 septembre 2009

ou est le zip
Messages postés
215
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
7 septembre 2007
1
le code est tiré directement de mon projet pro, il est donc adapté à mes connections et pas tres "réexploitable".

je vais commenter succintement en préfixant de >>> pour que tu t'y retrouves, je mets juste la partie connection, histoire de pas poluer non plus.


Imports System.data.SqlClient
>>> c'est pour sqlserver

Module AccesAdo
>>> Tu remarques déja que c'est un module et non une classe (et puis vu que tu comptes pas en hériter, ni t'en resservir comme modele, ni faire une surcharge du new, le fait de prendre une classe était trop lourd à mon avis).

'Enum des bases
Public Enum SqlBase
Geo
P_Compta
Gestpat
Gefag
End Enum

>>> je suis amené a me connecter a plusieurs bases connues (la liste au dessus) + d'autres éventuellement (environ 1000 donc je vais pas les lister dans un enum), j'ai donc 2 méthodes d'appel, une par la liste et une libre.

#Region "Connections à Sprofina101"
Public Function CnnSP101(Optional ByVal InitialCatalog As SqlBase = SqlBase.Gefag) As SqlConnection
'établie une connection au Serveur SQL de Profina SProfina101 sur l'une des bases courantes
Dim strConnectionString As String = "Data Source=SPROFINA101;" & _
"Integrated Security=SSPI;"
' Choix de la base
Select Case InitialCatalog
Case SqlBase.Geo : strConnectionString &= "Initial Catalog=Geo-Ag"
Case SqlBase.P_Compta : strConnectionString &= "Initial Catalog=P_Compta"
Case SqlBase.Gestpat : strConnectionString &= "Initial Catalog=Copie de GestPat"
Case SqlBase.Gefag : strConnectionString &= "Initial Catalog=GeFAG" 'base par defaut
Case Else 'rajouter les nouvelles connections ici
Exit Function
End Select

' renvoie la nouvelle connection
Return New SqlConnection(strConnectionString)
End Function

>>> cette fonction est ma fonction de base, sprofina101 est le nom de mon serveur, cela me renvoie une connection initialisée (si ça n'a pas planté bien sur)

Public Function CnnSP101(ByVal InitialCatalog As String) As SqlConnection
'surcharge de la classe précédente pour accéder a une base directement par son nom
Dim strConnectionString As String = "timeout=0; Data Source=SPROFINA101;" & _
"Integrated Security=SSPI;" & _
"Initial Catalog=" & InitialCatalog
Return New SqlConnection(strConnectionString)
End Function

>>> cette fonction, surcharge de la première, me permet d'acceder a une base par son nom, c'est pour les bases que j'utilise occasionnelement et/ou qui sont trop nombreuses a lister
#End Region

#Region "Connections préformatées (raccourcis)"
>>> tout ce qui suit ne sert foncièrement a rien, mais me permet d'augmenter la lisibilité de mon code: je sais de suite sur quelle base de donnée du serveur je travaille. ça n'a aucun interet si tu n'utilises qu'une base.

Public Function CnnGeo() As SqlConnection
Return CnnSP101(SqlBase.Geo)
End Function

Public Function CnnP_Compta() As SqlConnection
Return CnnSP101(SqlBase.P_Compta)
End Function

Public Function CnnGestPat() As SqlConnection
Return CnnSP101(SqlBase.Gestpat)
End Function

Public Function CnnGeFAG() As SqlConnection
Return CnnSP101(SqlBase.Gefag)
End Function
>>> tu remarqueras qu'elle appellent toutes ma fonction de base
#End Region

#Region "outils"
Public Function GetGrid(ByVal ProcedureStockee As String, ByVal BaseSql As SqlBase) As DataGrid
>>> apres j'ai quelques outils a la con, dont je me sers d'ailleurs jamais(ou rarement), qui me renvoie un dataset, un datagrid, qui executent une proc stockée ... sans que j'ai a me connecter au préalable
...

comme tu peux le voir, le code est tres simple et retourne toujours une connection (cette connection est en plus initialisée par un new, a voir si c'est bien ou non)



pour la gestion d'erreur, j'ai tendance a considérer que je vais toujours réussir a me connecter, donc je fais un test de connection au début et c'est tout

ensuite ce qui est important pour moi c'est de pas laisser trainer des connections, donc je faire comme suis:
dim maconn as connection = cnnXXX 'ou cnnXXX est la fonction qui me connecte a la base XXX sans me faire chier la bite

maconn.open
try
executecommande 'fait le travail a faire etc
catch
'gestion éventuelle des erreurs sur mon travail en cours sur la connection ici
finally
maconn.close
end try

ce genre de gestion d'erreur a un mérite: elle m'assure que la connection sera fermée si mes requetes ou autres ont plantées (mais par contre je ne teste pas la connection en elle meme comme je l'ai deja dit car j'ai tendance a savoir que ça va marcher, et si ça plante plus fort (arret intempestif du serveur ou autre), j'accuse le serveur et mon ego s'en sort tres bien).

pour conclure tu remarqueras que mes fonction n'ont pour but que de m'éviter l'ecriture de lignes toujours identiques et de me faciliter l' écriture/lecture du code.

voila j'espere avoir répondu au moins en partie a tes attentes
Messages postés
589
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
29 avril 2008
2
oui merci des commentaires , je veux bien un copier coller de ton code.
Messages postés
215
Date d'inscription
jeudi 24 octobre 2002
Statut
Membre
Dernière intervention
7 septembre 2007
1
moi j'aime pas bien ton code, j'aime pas ta méthode et j'aime pas non plus comment tu geres les erreurs.

le premier truc qui me choque dans ta classe, c'est que tu laisses sous entendre que c'est paramétrable sans passer de paramètres :
MyConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & Chemin_Base_De_Donnee
d'ou sort cette variable Chemin_Base_De_Donnee ?

ensuite le
If MyConn.State = ConnectionState.Open Then Return MyConn
ne sert a rien puisque tu viens de l'ouvrir une ligne au dessus. Et quand bien meme il servirait a quelque chose, dans l'autre cas rien n'est renvoyé.

pour la méthode il y a deux choses qui me déplaisent: d'une part tu ouvres la connection et tu la fermes a des endroits différents, d'autre part le msgbox ça pue: deja maintenant on est sensé utiliser messagebox.show mais surtout parceque tu as un msgbox dans ta classe externe ce qui veut dire que tu ne pourra plus gérer l'erreur dans ton programme appelant.



moi j'aurais fais un code du genre:

Public Function OleDbConn(DataBase As String) As OleDbConnection
dim Cnn as OleDbConnection = new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & DataBase )
'vérifie la syntaxe, je l'ecris en direct
return cnn
End Function

c'est générique.
ensuite si tu veux aussi coder l'ouverture de la connection avec gestion de l'erreur automatique, tu rajoutes un evenement pour l'erreur (au passage Ex.tostring te donne toutes les infos, pas la peine de construire un msg), et une sub pour la conn:

public function openconn (maconn as oledbconnection)as ConnectionState
try
maconn.open
catch ex as exeption
RaiseEvent ErreurConnection (Ex.tostring)
finally
' renvoie l'état de la connection dans tous les cas
return maconn.state
end try
end function

de manière plus globale je pense qu'externaliser ton acces au base est important mais qu'il ne faut pas se tromper sur qui fait quoi:
ta classe devrait être un module qui te fournit juste les parametres que tu ne veux pas réécrire sans cesse (comme la fonction oldbconn que j'ai écrit au dessus).
ensuite tes procédures métier appellent ce paramétrage et gerent l'erreur, en affichant par un message, cherchant a réouvrir la base ...


j'ai un module d'acces au donnée que j'utilise, il n'est certainement pas parfait mais corresponds a ce que je viens de dire, si tu veux je t'en fais un copié collé.

je mets 4 car l'idée de départ n'était pas mauvaise mais que la réalisation peche.
Messages postés
589
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
29 avril 2008
2
a rien tu as raison :)
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.