IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Ecrire une collection dans une BD Access [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut Ecrire une collection dans une BD Access
    Bonjour ,
    Je débute en VB.NET bien qu’ayant une petite expérience en VBA .
    Pour le morceau de code ci-dessous je cherche à écrire les strings d’une collection dans une BD access .
    Je n’aie pas mis imports system.string sinon la ligne avec « Split » ne fonctionne plus .
    Cela doit être trivial comme solution
    NB : macollection représente en fait un fichier texte ligne par ligne
    Ensuite chaques infos « d’une seule ligne » de la collection doit etre redistribuée
    Dans chaques colonnes du fichier Access (d’ou l’utilisation de split)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub envoitdsaccess(ByVal macollection)
     
            Dim mastrconnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\a\Bureau\Seb\TEST.mdb;Persist Security Info=False"
     
     
            Dim maconnection As New ADODB.Connection
            'Connexion à la base de donnée
            maconnection.Open(mastrconnection)
            maconnection.Execute("DELETE FROM CLIENT")  'efface le contenu de la table mais pas la table elle-même
     
            Dim lignecollection As Object
            Dim i As Integer = 1
            For Each lignecollection In macollection
                Dim tableau = Split(lignecollection, ",", 2)
     
                If i <> 1 Then ‘écrit tout sauf la première ligne de la collection
                    maconnection.Execute("INSERT INTO CLIENT ([Nom],[Prénom])" & _
                                         "VALUES ('Dupont', 'Jean')")  ' fonctionne
                    maconnection.Execute("INSERT INTO CLIENT ([Nom],[Prénom])" & _
                                         "VALUES ('tableau(0)', 'Tableau(1)')")  ' fonctionne aussi mais m’affiche dans Access Tableau(0)
    ' au lieu du contenu de tableau(0) et sans les simples quotes cela bugue
                End If
                i += 1
     
            Next
     
            maconnection.Close()
            maconnection = Nothing
     
     
        End Sub
    Merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    maconnection.Execute("INSERT INTO CLIENT ([Nom],[Prénom])" & _
                                         "VALUES ('" & tableau(0) & "', '" & Tableau(1) & "')")

    quand access recoit 'tableau(0)' pour lui c'est un string, et de toute facon il serait bien incapable d'aller voir la variable dans ton programme .net ^^
    il faut donc concaténer les variables dans la requete

    s'il peut y avoir des apostrophe dans les variables, il faut ajouter
    .replace("'","''")
    sinon ca ferme la variable trop tot et la requete plante
    où sinon tu peux voir les requetes paramétrées, car la concaténation d'une requete et de variables n'est pas toujours conseillé (surtout pour les dates)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    et en vb.net on utilises pas ADO mais ADO.NET
    ce qu'il te faut se trouves dans system.data.oledb

    d'une manière générale on évite d'ajouter des références COM ou ActiveX si ce n'est pas réellement utile
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Très bien cela fonctionne de concaténer les variables .(Je n’aime pas syntaxe trop lourde , j’aime ce qui est simple … Mais cela fonctionne)

    Ok , je me permet de rebondir sur ta remarque parce que justement au début
    Je suis partis comme ceci dans mon code .Alors , l’execution , tout se passe bien
    Pas de bugue , rien du tout .Sauf que le contenu de la base n’est pas effacée (je veux d’abord l’effacer entièrement avant d’écrire dedans).Du coup , je suis partis avec la solution d’activer les références COM et la sensation de tout mélanger .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub envoitdsaccess(ByVal macollection)
     
            Dim mastrconnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\a\Bureau\Seb\TEST.mdb;Persist Security Info=False"
     
     
           Using maconnection As New OleDbConnection(mastrconnection)
               maconnection.Open()
               Dim macommande As New OleDbCommand
               macommande.CommandText = "DELETE TABLE CLIENT"
               maconnection.Close()
           End Using
    end sub

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    oui le fonctionnement n'est peut etre pas tout à fait le meme, et ici tu n'exécutes pas la requête tout simplement

    OleDbConnection : contient la chaine de connexion, .open et .close (.dispose est à utiliser, ca libère la ram en plus de faire .close)
    OleDbCommand : contient la requete et les éventuels parametres (voir .Parameters)
    sur le command 3 possibilités :
    - .ExecuteNonQuery : exécute la requete sans retour (delete, insert, update, create table etc...)
    - .ExecuteReader : exécute la requete avec retour de lignes et colonnes (principalement pour les SELECT)
    - .ExecuteScalar : retourne une seule valeur, 1ère ligne 1ère colonne (pour des SELECT simple, mais rarement utile)

    utilisation du DataReder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cmd.commandtext = requete
    dim reader = cmd.executereader
    while reader.read ' .read se positionne sur une ligne, et retourne false s'il n'y a pas/plus de ligne (donc sortie de boucle)
       reader.item(nom colonne ou numéro colonne) ' retourne la valeur de la colonne pour la ligne actuelle
    end while
    reader.close
    NB : le commandtext peut contenir plein de requetes genre "delete machin" & vbcrlf & "select autre chose"


    dans ton cas si tu veux que la requete soit plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cmd.commandtext = "insert into client (nom,prénom) values (@nom,@prénom)"
    cmd.parameters.add("@nom",varchar).value = tableau(0))
    cmd.parameters.Add("@prénom",tableau(1))
    cmd.executenonquery
    je t'ai mis 2 possibilité de création de parameters, dont une sans spécifier le type (qui doit être déterminé à l'exécution je pense)
    le @devant le nom c'est pour sql server, ca fonctionne sur access je crois, mais il y a d'autres syntaxe comme ? sans nom derrière
    les parameters pour access doivent être créés dans l'odre d'apparation dans la requête

    les parameters sont obligatoire pour les dates, ca évite de les transformer en string, puis qu'access les retransformes en date, avec 2 possibilités d'erreur d'inversion jour/mois ; via le parameters la variable reste au format date de bout en bout (norme iso sans risque)
    pour les strings cela évite les problèmes d'apostrophe et d'injection de code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Pour l'instant , je préfère avancer tout doucement ...
    Aussi je me rabats sur ma première étape qui est d'éffacer la table CLIENT .
    Sans retour , sans rien du tout ...A priori rien de plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Using maconnection As New OleDbConnection(mastrconnection)
                maconnection.Open()
                Dim macommande As New OleDbCommand
                macommande.CommandText = "DELETE TABLE CLIENT"
                macommande.ExecuteNonQuery()
                maconnection.Close()
            End Using
    Mais la requete refuse de s'executer et je ne vois vraiment pas pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     macommande.ExecuteNonQuery()

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    en cas d'erreur, il y a un message d'erreur, qui doit être dans ton cas "pas de connexion" et une fois celui là réglé tu auras surement "erreur de syntaxe"

    il te manque macommand.connection = maconnection

    et delete table n'existe pas
    en plus dans l'autre code tu as bien mis delete from client ...

    il faut aussi des try catch, avec dans un 1er temps msgbox(ex.message) dans le catch


    et je crois que tu dois pouvoir utiliser using / end using sur le OleDbCommand
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            Try
     
                Using maconnection As New OleDbConnection(mastrconnection)
                    maconnection.Open()
                    Dim macommande As New OleDbCommand
                    macommande.Connection = maconnection
                    macommande.CommandText = "DELETE FROM CLIENT"
                    macommande.ExecuteNonQuery()
                    maconnection.Close()
                End Using
     
            Catch ex As Exception
                MsgBox(ex.Message)
     
            End Try
    La msgbox donnait
    ExecuteNonQuery: La propriété connection n'a pas été initialisée
    parce qu'il manquait comme tu l'as signalé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    macommande.Connection = maconnection
    Je pensais que tant que la connection était ouverte avec .open s'était bon ...
    Ouf !!
    Merci Pol63 j'aie appris plein de trucs .

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    sur des langages évolués et permettant de faire des tas de choses rien n'est implicite

    imaginons le cas
    créer connection à base 1
    créer connection à base 2
    créer command pour base 1
    créer command pour base 2
    lire depuis base 1 pour insérer dans base 2
    fin

    ici on a 2 connexions simultanées sur 2 bases différentes, si le command prenait une connection ouverte ca ne pourrait pas fonctionner ^^
    de plus il est possible à un instant T d'avoir x connexions ouvertes, même sur la même base
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Bonjour , je relance mon topic parce que .parameters présente un inconvénient
    .La boucle devient très lente en l’utilisant de plus tableau(0) et tableau(1)
    ne varient pas lors de leur écriture dans Access .Pourtant en les espionnant
    dans la boucle je constate que leurs valeurs changent .Incompréhensible .?!

    En supprimant .paramaters et en mettant tout dans la requete SQl .La rapidité revient et les bonnes valeurs tableau(0) et tableau(1) sont bien inscrites dans Access .

    NB :la lenteur constatée est de l’ordre de plusieurs minutes d’attente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub envoiedsaccess1(ByVal macollection)
     
            Dim mastrconnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\a\Bureau\Seb\TEST.mdb;Persist Security Info=False"
            Try
     
                Dim maconnection As New OleDbConnection(mastrconnection)
                maconnection.Open()
                Dim macommande As New OleDbCommand
                macommande.Connection = maconnection
                macommande.CommandText = "DELETE FROM TEST"
                macommande.ExecuteNonQuery()
     
                Dim lignecollection As Object
                Dim i As Integer = 1
                For Each lignecollection In macollection
                    Dim tableau = Split(lignecollection, ",", 2)
     
                    If i <> 1 Then
     
                        macommande.CommandText = "INSERT INTO TEST ([Nom],[Prénom]) VALUES (@Nom,@Prénom)"
                        'macommande.CommandText = "INSERT INTO TEST ([Nom],[Prénom]) VALUES ('" & tableau(0) & "','" & tableau(1) & "' )"   ‘RAPIDE
                        macommande.Parameters.AddWithValue("@Nom", VarChar).Value = tableau(0) ‘Lent et ne fait pas varier les valeurs dans Access
                        macommande.Parameters.AddWithValue("@Prénom", tableau(1)) ‘Lent et ne fait pas varier les valeurs dans Access
     
     
                        macommande.ExecuteNonQuery()
                    End If
                    i += 1
                Next
                maconnection.Close()
                maconnection = Nothing
     
     
            Catch ex As Exception
                MsgBox(ex.Message)
     
            End Try

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    avec ton code tu ajoutes 2 paramètres à chaque tour
    donc au final tu dois en avoir plusieurs dizaines et ca peut en effet ralentir
    donc soit tu ajoutes les paramètres avant la boucle (puis juste faire parameters("nom").value = tableau(x))
    soit faire parameters.clear (m'enfin vaut mieux faire le parameters.Add avant la boucle et définir la valeur à chaque tour sans .add)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 124
    Par défaut
    Ok merci Pol63 je n'aie pas malheureusement bien intégré ces notions de paramètres , d'objet command ,dataset etc ...

    Je pense que cela a quelque chose à voir mais en double cliquant sur un
    fichier .xsd puis en consultant les propriétés de l'objet "TESTTableAdaptater"
    dans "InsertCommand" ; je retombe sur "CommandText" et "Parameters"
    .Il y a même un générateur de requete pour "CommandText" .

    (Valable pour l'IDE Microsoft Visual Basic 2010 Express) .

    Peut-être que coder n'était même pas nécessaire ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Une collection dans une collection ?
    Par Crackerz dans le forum Symfony
    Réponses: 2
    Dernier message: 25/08/2014, 21h22
  2. Réponses: 4
    Dernier message: 04/07/2010, 16h44
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo