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 :

oledb + base access 2007 + requête delete impossible


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
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut oledb + base access 2007 + requête delete impossible
    Bonjour,

    Je vous écris aujourd'hui pour un autre problème dont je ne trouve pas la solution.

    J'ai un simple projet visual basic.net basé sur framework 4 pour garder une compatibilité avec windows XP pour l'instant encore présent chez certain de mes clients.

    Le projet gèrera une petite base access toute simple.

    Actuellement je travail autour de la table PSL.

    J'ai déjà une fonction GetPSL qui fonctionne impec, et me retourne le / les enregistrement présent dans la base.

    J'ai aussi coder une fonction Erase PSL (vide la table entière) qui elle ne fonctionne pas.

    Elle s’exécute correctement, mais ne fait pas ce qu'elle est sensé faire.

    Voici le code de ma fonction :

    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
     
     
    Public Function PI_ErasePsl() As Integer
     
            Try
     
                PI_DBConnect()
     
                Dim q As String = "DELETE FROM PSL"
     
                Dim cmd As New OleDb.OleDbCommand(q, PI_DB_connection)
     
                Dim ret As Integer = cmd.ExecuteNonQuery()
     
                MsgBox(ret)
     
                PI_DBDisconnect()
     
                Return ret
     
     
            Catch ex As Exception
     
                MsgBox("erreur : " & ex.Message)
     
                Return 1
     
            End Try
     
     
     
        End Function
    Je suis débutant en la matière, mais de plus en plus intéressé.
    Je ne sais pas si c'est juste, mais il me semble que ExecuteNonQuery() est une méthode ? qui retourne soit -1 en cas d'erreur, soit une valeur positive dépendant du nombre de row affecté.

    J'ai trouvé ces informations ici : https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx

    le messagebox de ma fonction servant au débug me retourne 1 (j'ai un enregistrement de test dans ma base).

    J'ai aussi un autre soucis mineure, je souhaiterais protéger par mot de passe ma base.

    Ce n'est pas le coté access qui me pose problème, je pense que c'est simple. Le soucis ce pose du coté code / connexion. J'ose imaginé que elle est peut être déjà posé ailleurs, mais je ne force personne à répondre concernant ce sujet.

    Voici le code de ma fonction de connexion à la base :

    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
     
        Public Function PI_DBConnect() As Boolean
     
            Dim funcode As String = "PI.4000.0001.0000"
     
     
            Try
                'build a connection string
                PI_DB_connection = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; " &
                                                   "Data source=PI_4000.accdb;")
     
                'open the connection
                PI_DB_connection.Open()
                Return False
     
            Catch ex As Exception
     
                MsgBox("Database Error 1:" & ex.Message, vbCritical, "Attention")
                PI_AddConsoleItem("Database Error 1", "", "")
                End
                Return True
            End Try
     
     
        End Function
     
    En espérant une réponse de la part d'un membre de ce forum, je vous remercie d'avance de votre futur réponse.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut
    Je ne crois pas avoir floodé avec un up unique.

    Je n'ai en attendant pas trouvé de vrai solution, mon problème persiste.

    Le but n'est pas de m'attirer des problèmes clementmarcotte, juste de trouvé une solution à mon problème.

    Je m'excuse encore pour ce up, mais je n'ai pour autant pas floodé, en admettant quand même qu'il dérange, mes excuses, mais je suis bien embêter, car en attendant je ne peux plus développer.

    Quelqu'un aurait-il une idée ? car je n'ai trouvé de résolution ni sur ce forum, ni sur aucun autre avant de poster ici ...

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    1. Vérifie en premier lieu que la syntaxe de ta commande est correct (voir si t'arrive à l'excuter sur Access).
    2. Utilise la syntaxe suivante pour effectuer ce genre d'opération. C'est plus propre/simple et ça évite pas mal de problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Using connexion As New OleDbConnection("connexionString")
                Try
                    connexion.Open()
                    Dim command = New OleDbCommand("SQL", connexion)
                    command.ExecuteNonQuery()
                Catch ex As Exception
                    MsgBox("erreur")
                End Try
            End Using


    J'ai aussi un autre soucis mineure, je souhaiterais protéger par mot de passe ma base.
    Pour la protection d'une base à l'aide d'un mot de passe

    https://support.office.com/fr-ch/art...0-fdb2673457ab

    La chaîne de connexion avec le mot de passe doit avoir le format suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\myFolder\myAccessFile.accdb;
    Jet OLEDB:Database Password=MyDbPassword;
    Il n'est pas conseillé d'enregistrer dans ton applications les chaînes de connexion avec un mot de passe. Idéalement tu devrais demander le mot de passe à l'utilisateur puis construire la chaîne avec sa réponse.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Par défaut Merci
    Merci pour ces informations ...

    Entre temps j'ai finis de résoudre ce problème.

    Cela venait d'une notion que je n'avais pas à l'époque ou j'ai appris à développé sous VB6 en BTS, à savoir la copie de la base.

    Il y à une base de base, dans laquelle j'avais des des données que j'avais ajouté, que je n'arrivais en fait pas à supprimé jamais.

    Tout ça parce que visual studio, il fait une copie de la database du projet, sensé être vide.

    Donc à chaque fois que je quittais l'exécution, les données revenaient ...

    tout était juste, sauf les bases que je n'avais pas à ce sujet.




    Merci pour la protection de la base, j'y jetterais un oeil.

    J'aurais en attendant une autre question concernant les requêtes SQL, la syntaxe plus exactement car j'ai une requête insert qui ne fonctionne pas.

    En fait, à l'execution de la requête je me mange un message " d'erreur : Erreur dans l'instruction insert into "

    Voici ma renquête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO psl (key, firstName, lastName, mail, firststart, expiredate) VALUES ('thisisyourkey', 'name', 'firstname', lastname', 'firstname.lastname@domain.com', True, 24/08/2016);

    (je l'ai copié depuis l'object clipboard)

    Alors j'aimerais bien avoir quelques informations d'ordre générale concernant Access :

    - Si dans ma base le champ s'appelle " LastName ", si j'écris " lastname " ou " LASTNAME " y'a-t-il une différence ? (gestion de la case)
    - Est ce que je met des simple quotte ' ou des double quotte " (guillemet ? ou deux fois simple quotte ?)
    - Quelle type de donnée à l'insertion ou update nécessite une quotte ? je crois savoir que integer ne nécessite par exemple pas de quotte, est-ce que bolean par exemple le nécessite ?
    - D'autres informations et conseil à me donné concernant la syntaxe sous access ?

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par enzo68290 Voir le message
    En fait, à l'execution de la requête je me mange un message " d'erreur : Erreur dans l'instruction insert into "

    Voici ma renquête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO psl (key, firstName, lastName, mail, firststart, expiredate) VALUES ('thisisyourkey', 'name', 'firstname', lastname', 'firstname.lastname@domain.com', True, 24/08/2016);
    Citation Envoyé par enzo68290 Voir le message
    - Si dans ma base le champ s'appelle " LastName ", si j'écris " lastname " ou " LASTNAME " y'a-t-il une différence ? (gestion de la case)
    Ca dépend du SGBDR. Par exemple dans MySQmerde il est possible d'activer/désactiver la sensibilité à la casse. Le mieux, c'est d'utiliser la même chose comme ca si jamais tu dois migrer d'un SGBDR vers un autre, tu n'auras pas de soucis. Pour les mots-clés en SQL (SELECT, etc.) la casse n'est pas importante, mais par soucis de lisibilité en les trouve souvent en majuscules, c'est un peu comme une convention.

    Citation Envoyé par enzo68290 Voir le message
    - Est ce que je met des simple quotte ' ou des double quotte " (guillemet ? ou deux fois simple quotte ?)
    C'est comme en Javascript, tu peux utiliser l'un ou l'autre selon ta préférence. Personnellement j'utiliser toujours des simple quotes. Et ca permet de mettre le doigt sur la syntaxe de ta requête :

    Si tu écris la requête comme tu l'as fait, il faut se préoccuper de ce point de détail. Si tu utilises une requête paramétrée, plus besoin de s'en occuper. Je te laisse te documenter à ce sujet

    Citation Envoyé par enzo68290 Voir le message
    - Quelle type de donnée à l'insertion ou update nécessite une quotte ? je crois savoir que integer ne nécessite par exemple pas de quotte, est-ce que bolean par exemple le nécessite ?
    Ce sont principalement les données de type string (incluant les bytes, les dates (sauf utilisation de mot cléf)...), les GUID.

    Citation Envoyé par enzo68290 Voir le message
    - D'autres informations et conseil à me donné concernant la syntaxe sous access ?
    Je pense qu'il te manque principalement l'utilisation des requêtes paramétrées. En plus de simplifier la syntaxe, ca permet :
    - De figer le plan d'exécution de la requête, puisque sa syntaxe ne change jamais. Les valeurs des paramètres sont transférés au SGBDR au dernier moment. L'optimiseur peut donc garder en mémoire le plan d'exécution de la requête et n'a pas besoin de le regénéré à chaque requête.
    - De se prémunir contre le risque d'attaque par injection SQL. Je te laisse te renseigner à ce sujet.
    - D'avoir un code plus robuste, puisque si par exemple tu essayes d'insérer un string dans un paramètre de type Int32, tu auras une exception directement visible avant l'exécution même de la requête. Si tu n'utilises pas de paramètre, l'exception n'aura lieu qu'après l'exécution de la requête. L'Exception sera lancée par le SGBDR, puis renvoyée à ton code puis affichée...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    A priori là on parle d'une base de données Access.

    Dans ce cas là, j'irais parié sur le format de la date qui doit être entre deux # pour Access.

    Une fois encore il suffit d'essayer de réaliser une requête insert depuis l'interface d'accès avec des valeurs fixes (pas une requête insert basée sur une autre requête) pour étudier la syntaxe en mode SQL. Pour les quotes elles sont en principe nécessaire pour le texte et à proscrire pour le reste. Ne pas oubliez à doubler les quotes éventuellement contenues dans le texte.

    Il est bien entendu plus efficaces d'utiliser les requêtes paramétrées mais c'est un autre sujet.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/08/2011, 11h59
  2. Comment approuver une base Access 2007
    Par curt dans le forum Sécurité
    Réponses: 4
    Dernier message: 29/08/2008, 21h12
  3. [ACCESS 2007] Requête de filtrage sur un bouton
    Par Jerez62 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/05/2008, 13h48
  4. Audit Trail sur Base Access 2007
    Par cjacquel dans le forum Access
    Réponses: 1
    Dernier message: 06/08/2007, 14h22
  5. [Système][07]Ouverture base access 2007
    Par Yanmeunier dans le forum Access
    Réponses: 3
    Dernier message: 26/03/2007, 18h34

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