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 :

Requête parémétrée ACCESS avec nom des paramètres "Microsoft.ACE.OLEDB.12.0"


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut Requête parémétrée ACCESS avec nom des paramètres "Microsoft.ACE.OLEDB.12.0"
    Bonjour à tous,

    j'adapte un projet Access vers VB.NET en conservant les données dans une base ACCDB.
    Pour me connecter à cette base j'utilise le provider "Microsoft.ACE.OLEDB.12.0".
    Jusque là tout va bien, tout est adapté correctement ... ou presque.
    Un détail me chagrine, je me suis embêté à mettre des jolies requêtes paramétrées, j'ai donné de jolis noms aux paramètres ... mais le provider semble se moquer totalement des noms !
    Il prend en compte l'ordre des paramètres.

    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
    Private connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""""mabase.accdb"""" "
     
    Dim connexion As New System.Data.OleDb.OleDbConnection(connectionString)
    connexion.Open()
     
    Dim requete as string = "UPDATE environnements " & _
            "SET nom = ParamNom, libelle = ParamLibelle" & _
            "WHERE nom=ParamOldNom;"
     
    Dim commande As System.Data.OleDb.OleDbCommand
    commande = New system.Data.OleDb.OleDbCommand(requetes.qry_environnement, connexion)
     
    commande.Parameters.AddWithValue("ParamNom", nom)
    commande.Parameters.AddWithValue("ParamLibelle", libelle)
    commande.Parameters.AddWithValue("ParamOldNom", oldNom)
     
    commande.ExecuteNonQuery()
     
    commande.Dispose()
    connexion.Close()
    ça par exemple pas de soucis

    Si je change l'ordre d'ajout des paramètres à la commande, la paramètre libellé de la requete va recevoir le nom, et le paramètre nom de la requêtre va recevoir le libelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    commande.Parameters.AddWithValue("ParamLibelle", libelle)
    commande.Parameters.AddWithValue("ParamNom", nom)
    commande.Parameters.AddWithValue("ParamOldNom", oldNom)
    J'ai testé avec d'autres syntaxe pour qu'il prenne en compte le nom des paramètres, et non leur ordre, mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim requete as string = "UPDATE environnements " & _
            "SET nom = @Nom, libelle = @Libelle" & _
            "WHERE nom=@OldNom;"
    commande.Parameters.AddWithValue("@Libelle", libelle)
    commande.Parameters.AddWithValue("@Nom", nom)
    commande.Parameters.AddWithValue("@OldNom", oldNom)
    L'effet est le même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim requete as string = "UPDATE environnements " & _
            "SET nom = ?Nom, libelle = ?Libelle" & _
            "WHERE nom=?OldNom;"
    commande.Parameters.AddWithValue("?Libelle", libelle)
    commande.Parameters.AddWithValue("?Nom", nom)
    commande.Parameters.AddWithValue("?OldNom", oldNom)
    Le "?" provoque une erreur de syntaxe ...

    Est-ce que je suis condamné à respecter l'ordre des paramètres avec ce provider ?
    Si non : quelle syntaxe utiliser ?
    Si oui : un provider "plus intelligent" corrige-t-il ce défaut ?

    Merci de votre aide, bien que ce soir un détail et que ça ne soit pas bloquant, je n'aime pas ce genre de petits défauts.

  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
    ca doit venir d'access, il y a le même problème avec JET
    le nom des paramètres n'est pas utilisé
    à la place des noms on peut mettre des ? (sans nom derrière par contre, et même sur chaque)
    dans le parameter on peut inventer des noms qui ne sont pas dans la requete ...

    ce qu'il faut donc retenir, c'est qu'il faut éviter access ^^ (en plus il y a tellement mieux pour le même prix)

    access a plein d'autres défauts, mais ca ce n'est pas même plus un défaut c'est un gros piège !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Oh oui, s'il n'y avait que moi Access serait bannit depuis un moment ...
    Là le hasard a fait que je me suis rendu compte qu'il se moque de mes noms, heureusement pour moi.

    Ça va en général je suis organisé et je les met dans le bon ordre, mais une exception et voilà ...

    J'ai déjà réussi à les faire abandonner plus ou moins Access pour les applications, reste à y arriver pour les données.

    Merci pour cette réponse sur Jet, ça m'évite de tout refaire et m'apercevoir que c'est la même chose.

    Je marque en résolu, mais si quelqu'un trouve un Provider qui force Access à être intelligent je suis preneur.

  4. #4
    Membre chevronné Avatar de Vince
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    369
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 369
    Par défaut
    Pourquoi ne pas écrire directement les paramètres dans la string de la requête SQL ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim requete as string = "UPDATE environnements " & _
            "SET nom = '" & Replace(ParamNom, "'", "''") & "', libelle = '" & ParamLibelle & "' & _
            "WHERE nom='" & ParamOldNom & "';"
    Le Replace(ParamNom, "'", "''") est utile si la valeur stockée dans la variable contient une apostrophe, sinon ça plante à l'exécution de la requête...

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Parce que c'est pas propre, pas sécurisé, pas beau, bref fortement déconseillé.

  6. #6
    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
    Citation Envoyé par Vince Voir le message
    Pourquoi ne pas écrire directement les paramètres dans la string de la requête SQL ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim requete as string = "UPDATE environnements " & _
            "SET nom = '" & Replace(ParamNom, "'", "''") & "', libelle = '" & ParamLibelle & "' & _
            "WHERE nom='" & ParamOldNom & "';"
    Le Replace(ParamNom, "'", "''") est utile si la valeur stockée dans la variable contient une apostrophe, sinon ça plante à l'exécution de la requête...
    tu peux faire une recherche sur l'injection sql, faille de sécurité la plus connue (si quelqu'un entre du code sql dans un textbox il peut faire ce qu'il veut sur la base de données)
    sur un site web en quelques minutes tu peux obtenir tous les logins par exemple

    il y a aussi le cas des dates et des decimaux, les formats peuvent être différents d'un pc à l'autre, car ca se base sur les paramètres de windows, en passant par des parameters, les types sont transportés nativement (une date est un codage sur 8 octets), donc aucun risque de bug
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  2. Réponses: 5
    Dernier message: 10/02/2010, 14h11
  3. Réponses: 1
    Dernier message: 11/09/2007, 10h12
  4. Requête pour récupérer le nom des champs
    Par legillou dans le forum JDBC
    Réponses: 1
    Dernier message: 08/02/2006, 16h09
  5. base avec nom des pays
    Par jack-daniel dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/07/2003, 14h16

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