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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 43
    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 : 43
    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 : 43
    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()

+ 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