C'est la première fois que j'essaie d'utiliser une base de donnée avec .NET. C'est pas du VB6 purée wah !
C'est quoi le mieux ADO, SQL, OLE ... ?
C'est intégralement inclus dans le framework ?
La base de donnée est déjà crée (MDB/Access 2003) et donc voila ou j'en suis...que choisir et comment utiliser une base en .net ?
Ou est mon recordset oldschool ?
Exemple: RS.Field("Nom") = "moi"
Je suis complètement perdu.
Imports System
Imports System.Data
Imports System.Data.OleDb
Public Class c_Database
Private Property myCnx As OleDbConnection = Nothing
Private Property myCmd As OleDbCommand = Nothing
Private Property myMDB As String = Nothing
Public Sub SetDataPath(ByVal pathMDB As String)
myMDB = pathMDB
End Sub
Public Function CMD_Create(ByVal strSQL As String) As OleDbDataReader
Try
myCmd = myCnx.CreateCommand
myCmd.CommandText = strSQL
myCnx.Open()
Return myCmd.ExecuteReader
Catch ex As Exception
MessageBox.Show("La création de la requête à échoué !" & ControlChars.NewLine & ex.Message, "Erreur CreateCMD", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return Nothing
End Try
End Function
Public Sub ConnexionClose()
Try
If myCnx IsNot Nothing Then
If myCmd IsNot Nothing Then
If myCmd.ExecuteReader.IsClosed = False Then
myCmd.ExecuteReader.Close()
End If
myCmd = Nothing
End If
myCnx.Close()
End If
Catch ex As Exception
MessageBox.Show("Problème lors de la fermeture de la base de donnée !" & ControlChars.NewLine & ex.Message, "Erreur ConnexionClose", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Public Function ConnexionStart() As Boolean
If IO.File.Exists(myMDB) = False Then
MessageBox.Show("Le chemin à la base de données n'est pas configuré !", "Attention", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return False
End If
Try
myCnx = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & myMDB)
Return True
Catch ex As Exception
MessageBox.Show("Problème lors de la connexion à la base de données !" & ControlChars.NewLine & ex.Message, "Erreur ConnexionStart", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
End Try
End Function
End Class
Bonjour Duke49,
Je me suis récement essayé a ce genre d'appli.
J'ai eu le même effroi ... ils ont oublié recordset ...
Voici un début de class OLE avec access.
C'est assez compliqué et j'ai oublié comment j'ai fais.
http://www.vbfrance.com/codes/GESTION-SIMPLE-BASE-ACCESS_52702.aspx J'espere que tu y trouvera une piste.
Cordialement CGSI3
C'est vrai que l'approche est différente et qu'au début on se sent perdu sans notre bon vieux recordset, mais au final, avec un exemple simple, on se rend compte que ca n'est pas si compliqué et différent que ca.
Voici un petit exemple tout simple :
'Création de la connexion
Using maConnection As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=C:\MaBase.mdb")
'Ouverture de la connexion
maConnection.Open()
'Création de la requète
Using maRequete As New OleDb.OleDbCommand("SELECT id, libelle FROM TOTO", maConnection)
'Exécution de la requète (le DataReader est le remplacant de notre Recordset)
Dim cestmoiRecordset As OleDb.OleDbDataReader = maRequete.ExecuteReader()
'Parcour du résultat (notre ancien While not monrecordset.eof)
While cestmoiRecordset.Read()
'On lit le premier champ en sachant que c'est un entier
'(la on aurait fait monrecordset("id"))
id = cestmoiRecordset.GetInt32(0)
'On lit le deuxième champ en sachant que c'est un string
'(la on aurait fait monrecordset("libelle"))
libelle = cestmoiRecordset.GetString(1)
Console.WriteLine("id {0} ; libelle {1}", id, libelle)
End While
End Using
'Fermeture de la connection
maConnection.Close()
End Using
Tout d'abord, pour ne pas embrouiller Duke49, une petite explication.
En .Net il existe deux méthodes pour accéder aux données :
1) Mode connecté
On ouvre une connexion, on exécute une requête, on exploite le résultat.
(Couple OleDbConnection, OleDbCommand, OleDbDataReader)
2) Mode déconnecté
On remplit un DataSet, on travaille sur le résultat (ajouts, modifications, suppressions de lignes), on met à jour la base à l'aide du DataSet et d'un DataAdapter.
(Couple DataSet, DataAdapter)
- Un DataSet est un ensemble d'une ou plusieurs tables (DataTable).
- Une DataTable est constituée de colonnes (DataColumns) et de lignes (DataRow)
- Un DataAdapter permet de remplir et mettre à jour un DataSet
Grossièrement un adapter est un objet composé de 4 requètes (OleDbCommand) :
+ Une requête de remplissage (SelectCommand)
+ Une requête d'insertion (InsertCommand)
+ Une requête de mise à jour (UpdateCommand)
+ Une requête de suppression (DeleteCommand)
La méthode 'Fill' appelle la requête de remplissage.
La méthode 'Update' parcour les lignes de la table et appelle la requête d'ajout, de modification ou de suppression en fonction des modifications effectuées sur la ligne.
Je ne m'étends pas plus car il doit y avoir bon nombre d'exemples sur ce sujet.
Pour répondre a CGSI3 voici un petit exemple :
Using maConnection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MaBase.mdb")
monDataSet.Clear()
Dim monAdapter = New OleDbDataAdapter("SELECT id, libelle FROM MaTable", maConnection)
monAdapter.SelectCommand.Connection = maConnection 'C'est la méthode fill qui ouvrira et fermera la connection
monAdapter.Fill(monDataSet, "MaTable")
'L'objet BindingSource sera plus souple que d'affecter directement la table
'il nous permettra de filtrer et de trier les données.
Dim bindingSrc As New BindingSource(monDataSet, "MaTable")
'Rempli la grille avec création automatique des colonnes
Me.DataGridView1.DataSource = bindingSrc
'Rempli le combobox
Me.ComboBox1.ValueMember = "id" 'Champ utilisé pour la valeur
Me.ComboBox1.DisplayMember = "libelle" 'Champ utilisé pour l'affichage
Me.ComboBox1.DataSource = bindingSrc
'Rempli la grille avec choix des colonnes
Me.DataGridView2.AutoGenerateColumns = False 'On bloc la création auto des colonnes
Me.DataGridView2.Columns.Clear() 'On vide la grille de toute colonne
Dim colonne As New DataGridViewTextBoxColumn() 'On cré un nouvelle colonne de type text
colonne.Name = "maColonneLibelle" 'Nom de la colonne
colonne.HeaderText = "Le Libelle" 'Text d'en-tête de la colonne
colonne.DataPropertyName = "libelle" 'Champ de liaison avec notre table
Me.DataGridView2.Columns.Add(colonne) 'Ajout de la colonne à la grille
DataGridView2.DataSource = bindingSrc 'Remplissage de la grille
'Affichage uniquement de la ligne avec id = 1
bindingSrc.Filter "id 1"
End Using
Public Function NombreDeFournisseur() As Integer
Dim ic As Integer
Using maConnection As New OleDb.OleDbConnection(ConnexionPath)
maConnection.Open()
Using maCommand As New OleDb.OleDbCommand("SELECT COUNT(*) FROM Fournisseurs", maConnection)
ic = CType(maCommand.ExecuteScalar(), Integer)
End Using
maConnection.Close()
End Using
Return ic
End Function
Remplir un dataset uniquement pour compter est peut être un peut lourd.
ExecuteScalar vous permet de récupérer directement le résultat d'un COUNT, SUM et autres fonctions scalaires.
J'ai une question également
J'ai fabriqué ce code dans mon appli pour un datagrid. (il fonctionne)
J'ai essayé de l'extrapoler au combobox pour une autre question sur le forum mais cela ne marche pas !
J'ai 3 lignes identiques qui s'affiche sur le combobox:
System.Data.DataRowView
System.Data.DataRowView
System.Data.DataRowView
Peut on alors juste récupérer une colonne ou une ligne de cette manière?
Sub Export(ByVal Table As String, ByVal Grille As Object)
'Auteur: CGSI3 But: Initialise un datagrid
MonDataSet.Clear() 'On vide le DataSet pour ne pas que les données s'ajoutent
Connection.Open()
Dim requete As String = "SELECT * FROM " & Table
MonAdapter = New OleDb.OleDbDataAdapter(requete, Connection)
'Méthode pour récupérer les données d'une table d'un fichier chargées dans un DataGrid
MonAdapter.Fill(MonDataSet, Table) 'On rempli le DataSet
Dim Matable As DataTable
Matable = MonDataSet.Tables(Table) 'remplissage du DataGrid avec le DataSet
Grille.DataSource = Matable
Connection.Close()
End Sub
Nickel !
Encore une fois Merci pour tes exemples Foliv57, J'avoue avoir récupéré un tas de tutos sur ce sujet sans jamais réussir a trouver ce genre de code.
Comme dirais ma petite fille, tu me sauve la Vie !
J'essaierai de rajouter tout cela a ma petite source des que je pourrais.
Bonne journée CGSI3
Oui, très interessant même. Je l'ai déjà mis en avant d'autres fois sur le forum.
C'est tout simple, USING peut être utilisé avec tous les types implémentant l'interface IDisposabe (remarquable par le fait que le type contient une méthode 'Dispose').
Il permet de garantir la libération des resources en cas de levée d'exception.
Notamment dans le cas d'une OleDbConnection. En réalité il n'est pas nécessaire d'appeler maConnection.Close() au sain du USING car il est fait automatiquement au End Using, même si une exception se produit.
On est donc certain qu'après End Using la connexion est correctement libérée.
Concrètement faire :
Using maConnection as New OleDbConnection("ChaineDeConnexion")
maConnection.Open()
End Using
Equivaut à :
Dim maConnection as New OleDbConnection("ChaineDeConnexion")
Try
maConnection.Open()
Catch ex as Exception
Finally
maConnection.Dispose() 'Ou .Dispose() appelle .Close()
End Try
Qu'auriez-vous fait a ma place pour faire un compte depuis une requête ?
Public Function NombreDeFournisseur() As Integer
Dim ic As Integer
Using maConnection As New OleDb.OleDbConnection(ConnexionPath)
maConnection.Open()
Using monAdapt As New OleDbDataAdapter("SELECT Nom From Fournisseurs", maConnection)
Dim monDataSet As New DataSet
monAdapt.Fill(monDataSet)
Dim maTable As DataTable = monDataSet.Tables(0)
ic = maTable.Rows.Count
End Using
maConnection.Close()
End Using
Return ic
End Function