VB.NET - Aide et conseil pour une classe de gestion database [Résolu]

Signaler
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
-
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
-
Salut à vous !

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

12 réponses

Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
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
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Bonjour,

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
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
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
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Plutot ceci :
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.
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Bonsoir Foliv57,
Merci pour ton exemple,

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


Cordialement CGSI3
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
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
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
CGSI3
foliv57
Merci à vous les gars !

foliv57, explications et exemples, extra !
Using... ? Intéressant !
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Using... ? Intéressant !


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
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut Duke49

bon courage
je me suis mis aussi au database en net
'Indiana jones et le mystère du recordset'
vas y doucement
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
hihihi ShayW ^^
Merci, bon courage aussi.
j'vais y aller façon "tortoise vs hare"; lent et constant :)
++
Messages postés
550
Date d'inscription
jeudi 12 octobre 2006
Statut
Membre
Dernière intervention
6 juin 2015
4
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
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

tu devrais poster la question dans un nouveau
post