SE CONNECTER A ACCESS ET RETOURNER DATESET

enysby Messages postés 8 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 7 septembre 2007 - 18 avril 2005 à 15:52
cs_hicham1 Messages postés 2 Date d'inscription mardi 23 mai 2006 Statut Membre Dernière intervention 15 septembre 2009 - 25 févr. 2007 à 23:42
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

cs_hicham1 Messages postés 2 Date d'inscription mardi 23 mai 2006 Statut Membre Dernière intervention 15 septembre 2009
25 févr. 2007 à 23:42
ou est le zip
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
12 juil. 2005 à 17:42
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
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
11 juil. 2005 à 15:59
oui merci des commentaires , je veux bien un copier coller de ton code.
cs_Benouille Messages postés 215 Date d'inscription jeudi 24 octobre 2002 Statut Membre Dernière intervention 7 septembre 2007
11 juil. 2005 à 10:59
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.
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
21 avril 2005 à 17:39
a rien tu as raison :)
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
21 avril 2005 à 11:40
pourquoi ne pas surcharger les constructeurs et destructeurs et y implementant l'ouverture et la fermeture de la connection a la BD, plutot que d'ouvrir puis fermer a chaque fois une connection ?
--> Dim MyDsConfig As New DataSet : je n'ai pas trop compris a quoi ca servait dans la procedure openconnection
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
18 avril 2005 à 18:21
ben tu peux faire ta requete du genre
"CREATE DATATABLE " & textbox1.text & " ...., mais le mieux pour sql server est l'utilisation de procedure stockée qui sont bcp plus rapide
enysby Messages postés 8 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 7 septembre 2007
18 avril 2005 à 15:52
slt!!!cool la source mais jé un ptit pb avec une connexion sql server!
je suis deja connecter et je veux bien ajouter une nouvelle table mais avec le nom de la table pris d'un textbox et le pb est comment paramétré ma requete ,j'y suis bien arrivé à la creér mais avec un nom entré dans la requete!!
merci pr votre aide!
Rejoignez-nous