SE CONNECTER A ACCESS ET RETOURNER DATESET

Signaler
Messages postés
8
Date d'inscription
jeudi 18 mars 2004
Statut
Membre
Dernière intervention
7 septembre 2007
-
Messages postés
2
Date d'inscription
mardi 23 mai 2006
Statut
Membre
Dernière intervention
15 septembre 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30740-se-connecter-a-access-et-retourner-dateset

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.
Afficher les 8 commentaires