none
Besoin éclaircissement sur la classe OleDbParameterCollection RRS feed

  • Question

  • Bonjour,

    mon besoin initial était de pouvoir mettre à jour ma base de données via un datagridview, le souci est que j'avais non pas une mais deux tables. Le commandbuilder ne fonctionne pas dans ce cas là, j'ai donc fait mon update manuellement pour chaque ligne susceptible d'être modifiée, exemple :

    Update = New OleDbCommand("UPDATE Article SET Article.Stock_réel = @Stock WHERE (((Article.Code_Article)='BMAMP1'))", Connexion)
    Update.Parameters.AddWithValue("@Stock", DG_DataGrid.CurrentCell.Value)
    DataSetAdaptateur.UpdateCommand = Update
    DataSetAdaptateur.Update(DataSet, "DataTableCreation")

    Mais je me suis aperçu que l'update fonctionnait également sans cette ligne de code :

    Update.Parameters.AddWithValue("@Stock", DG_DataGrid.CurrentCell.Value)

    Du coup je me demandais dans quel cas utilise-t-on OleDbParameterCollection.AddWithValue ? Dans le cas d'une requête qui demande beaucoup de paramètres ? Et quelle est cette syntaxe avec @ ? Tableau associatif ?

    Merci d'avance de votre aide.





    • Modifié rocketter lundi 11 avril 2016 06:49
    lundi 11 avril 2016 06:45

Réponses

  • Une requête SQL est une commande en texte contenant les instructions à effectuer. Dans votre cas il faudrait transformer votre valeur en texte pour que votre requête soit correcte. Toutefois c'est contraignant (il faut transformer toutes les valeurs numériques ou dates telles que le comprend le serveur) et risqué (une chaîne texte doit être protégée des attaques de type SQL injection).

    De plus cela ne permet pas de placer les requêtes dans des fichiers de configuration par exemple pour permettre une meilleure lisibilité et maintenance.

    C'est là qu'interviennent les paramètres. Ils permettent de convertir des valeurs .Net correctement et de manière protégée en SQL et de faire les remplacements dans le script à l'endroit où est défini chaque paramètre.

    Dans votre cas sans paramètre il faudrait calculer votre script avec un code du genre :

    String sql = "UPDATE Article SET Article.Stock_réel = " + varQte.ToString(CultureInfo.InvariantCulture) + " WHERE (((Article.Code_Article)='BMAMP1'))";
    

    Ce qui est moins pratique et lisible que ce que vous faîte maintenant avec des paramètres.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse rocketter lundi 11 avril 2016 14:25
    lundi 11 avril 2016 09:59

Toutes les réponses

  • Bonjour,

    Est-ce que votre requête fonctionne réellement (cad elle modifie correctement votre valeur) ?

    Car normalement avec OleDB les paramètres de requêtes sont les "?" pas "@xx" (voir les notes de cette page https://msdn.microsoft.com/fr-fr/library/system.data.oledb.oledbcommand.parameters%28v=vs.110%29.aspx).

    "@xx" est la notation d'une variable en SQL Server qui est réutilisée avec SqlDbCommand (accès aux base de données SQL Server en natif).

    OleDbParameterCollection.AddWithValue() est une méthode qui permet d'ajouter directement un nouveau paramètre avec un nom est une valeur. Alors que normalement il faut créer le paramètre avant de l'ajouter.

    Cordialement.


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    lundi 11 avril 2016 07:32
  • Merci de votre réponse.

    Oui avec le paramètre @ ça passait. Les nouvelles valeurs étaient affichées dans ma bdd.

    Qu'est ce qu'un paramètre finalement ? S'agit-il de ce que nous trouvons derrière la clause WHERE sql ?

    lundi 11 avril 2016 09:18
  • Une requête SQL est une commande en texte contenant les instructions à effectuer. Dans votre cas il faudrait transformer votre valeur en texte pour que votre requête soit correcte. Toutefois c'est contraignant (il faut transformer toutes les valeurs numériques ou dates telles que le comprend le serveur) et risqué (une chaîne texte doit être protégée des attaques de type SQL injection).

    De plus cela ne permet pas de placer les requêtes dans des fichiers de configuration par exemple pour permettre une meilleure lisibilité et maintenance.

    C'est là qu'interviennent les paramètres. Ils permettent de convertir des valeurs .Net correctement et de manière protégée en SQL et de faire les remplacements dans le script à l'endroit où est défini chaque paramètre.

    Dans votre cas sans paramètre il faudrait calculer votre script avec un code du genre :

    String sql = "UPDATE Article SET Article.Stock_réel = " + varQte.ToString(CultureInfo.InvariantCulture) + " WHERE (((Article.Code_Article)='BMAMP1'))";
    

    Ce qui est moins pratique et lisible que ce que vous faîte maintenant avec des paramètres.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    • Marqué comme réponse rocketter lundi 11 avril 2016 14:25
    lundi 11 avril 2016 09:59
  • Merci beaucoup de cette réponse très précise :-)

    Dans quelles situations utilise-t-on cette commande ?
    lundi 11 avril 2016 13:28
  • Pour les raisons que j'ai indiquées précédemment, il faut utiliser les requêtes paramétrées tout le temps.

    Construire soi-même ses requêtes implique de connaître les formats de conversion en SQL (ce qui n'est pas toujours facile), et ouvre la porte aux erreurs et aux risques de faille de type 'injection. De plus la lisibilité de la requête devient plus difficile et donc leur maintenance également.

    Cordialement,

    PS: N'oubliez pas de marquer les réponses qui ont répondues à votre question.


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    lundi 11 avril 2016 13:37
  • J'ai écrit ma requête sans paramètres et je n'ai pas eu de soucis :
    Update = New OleDbCommand("UPDATE Article SET Article.Libellé_Article = '" & DG_DataGrid.CurrentCell.Value & "' WHERE (((Article.Code_Article)="BMAMP1")), Connexion)
    Vous me conseillez d'utiliser les paramètres quand même ?
    lundi 11 avril 2016 14:24
  • Oui comme je l'ai stipulé précédemment.

    Vous n'avez pas de problème car votre valeur est certainement un entier, si vous avez un réel, la conversion par défaut va utiliser la langue en cours donc un séparateur décimal ',' (si votre poste est en français) et là le serveur SQL ne comprendra pas votre requête. Même problème avec les dates et autres joyeusetés.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    lundi 11 avril 2016 14:29
  • Ça marche, merci beaucoup de vos réponses ; je comprends maintenant.
    lundi 11 avril 2016 14:41