none
Quelques soucis avec Webmatrix RRS feed

  • Question

  • Bonjour,

    Je travail actuellement sous webmatrix et j'ai quelques erreurs que je n'explique pas, et que, par conséquent, je n'arrive pas à résoudre...

    Premier problème : Dans la cadre de la modification d'un profil je souhaite donc modifier les données d'une table à la ligne correspondante de l'utilisateur.

    <fieldset id="fieldset1">
                    <form method="post" action=""> 
                    <legend>Formulaire de modification du profil</legend>   
                  
                    <label  for="pseudo">pseudo :</label>
                 
                   
                    <input name="pseudo" id="pseudo" type="text" value="@pseudo"/>
                    <span class="tooltip">Un pseudo ne peut pas faire moins de 4 caractères</span>
    
    <input type="hidden" name="idMember" value="@WebSecurity.CurrentUserId" />
                    <input class="inscription" type="submit" value="Valider mes informations" /> <input class="raz" type="reset" value="Réinitialiser le formulaire" /> 
                    </form>
    	        </fieldset>

    Voilà pour le code html et pour le traitement de la requête :

    @{  
        Layout = "~/accueil.cshtml";
        Page.Title = "Modification de mon Profil !";
        
        var db = Database.Open("StarterSite");
        var selectQueryString = "SELECT * FROM UserProfile";
        
        var pseudo="";
        var idMember="";
       
        if (IsPost) {
                   
            pseudo=Request.Form["pseudo"];
            idMember=Request.Form["idMember"]; 
            
            var updateQuery="UPDATE UserProfile SET pseudo=@0 WHERE UserId=@1";
            db.Execute(updateQuery, idMember);
            Response.Redirect("~/profil.cshtml");   
            
        }
    }

    Et avec cela j'ai l'erreur suivante : 

    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 
    
    Détails de l'exception: System.IndexOutOfRangeException: Un SqlCeParameter avec ParameterName « 1 » n'est pas contenu dans ce SqlCeParameterCollection.
    
    Erreur source: 
    
    
    Ligne 15 :         
    Ligne 16 :         var updateQuery="UPDATE UserProfile SET pseudo=@0 WHERE UserId=@1";
    Ligne 17 :         db.Execute(updateQuery, idMember);
    Ligne 18 :         Response.Redirect("~/profil.cshtml");   
    Ligne 19 :         

    Pourriez vous m'aider s'il vous plaît ?

    En vous remerciant,

    Florian, étudiant à Polytech Paris Sud qui aime promouvoir webmatrix. 

    <form action="" method="post"></form>
    dimanche 26 février 2012 18:28

Réponses

  • Désolé, j'ai fait une faute de frape.

    Mais en revenant sur votre code, je me suis rendu compte que votre requête attend deux paramètres là où vous en fournissez qu'un.

    Modifier plutôt votre code de la façons suivante :

    var updateQuery="UPDATE UserProfile SET pseudo='@0' WHERE UserId=@1";
    db.Execute(updateQuery, pseudo, idMember);

    J'ai supposé que la colonne [pseudo] est de type varchar, si c'est pas le cas ou s'il y a un souci enlevez les apostrophes. 

    Cordialement.


    lundi 27 février 2012 10:42
    Auteur de réponse
  • Bonjour,

    D'abord, vous nous embêter pas du tout, c'est toujours intéressant que de telle discussion se prolonge.

    Pour ce qui est de l'ajout d'apostrophes je l'ai rajouter car j'ai supposé que le champ [pseudo] était de type string, ce qui n'est pas le cas peut-être

    ou l'implémentation de la méthode Database.Execute s'en charge peut-être.

    Mais la clé de votre problème était l'oublie du paramètre pseudo.

    Quant à votre deuxième question, pour quoi ne pas passer en paramètre "repondu" :

    Ce n'est visiblement pas nécessaire car sa valeur était connue à l'avance (=1), il s'agit d'une constante connue au moment de l'écriture d code.

    Par contre dans votre requête qui a posé problème, on voie clairement qu'on voulait mettre à jour le pseudo d'un membre quelconque, le membre et la valeur du pseudo ne sont connu qu'à l’exécution et peuvent prendre un ensemble de valeurs fournies à l’exécution.

    Cordialement.

    lundi 27 février 2012 20:26
    Auteur de réponse

Toutes les réponses

  • Bonjour,

    Bien que je ne sais pas l’interface exacte de votre type DataBase, je présume que le code suivant devrait vous faire éviter l'erreur que vous décriviez :

    var updateQuery = string.format("UPDATE UserProfile SET pseudo=@0 WHERE UserId={0}", idMember);
    db.Execute(updateQuery);

    Si db.Execute(updateQuery), remplacez la par db.Execute(updateQuery, idMember).

    Mais le message d'erreur laisse voir clairement que Ado .NEt n'arrive pas à trouver une valeur pour votre Sql parameter @1.

    Vous devez revenir sur l'implémentation de la méthode Database.Execute, ou consulter sa spécification.

    Cordialement.

    lundi 27 février 2012 09:06
    Auteur de réponse
  • Bonjour, 

    Je vous remercie de prendre un peu de temps pour me répondre :)

    Concernant votre solution, lorsque je l'essaye cela me donne l'erreur suivante : 

    Description : Une erreur s'est produite lors de la compilation d'une ressource requise pour répondre à cette demande. Veuillez consulter ci-dessous les détails relatifs à l'erreur en question, puis modifier votre code source de manière appropriée. Message d'erreur du compilateur: CS0117: 'string' ne contient pas de définition pour 'format' Erreur source: Ligne 13 : pseudo=Request.Form["pseudo"]; Ligne 14 : idMember=Request.Form["idMember"]; Ligne 15 : var updateQuery = string.format("UPDATE UserProfile SET pseudo=@0 WHERE UserId={0}", idMember); Ligne 16 : db.Execute(updateQuery);


    Concernant le fait que Ado.net ne trouve pas @1 c'est bien le cas en effet puisque lorsque je l'enlève et que je lui donne une valeur arbitraire pour UserId ça marche très bien. 

    Pour ce qui est de revenir sur l'implémentation de la méthode Database.Execute ou consulter sa spécification à vrai dire je ne comprends pas très bien "où quand comment ?" :/ On peut dire que dans ce domaine de l'informatique je débute et je n'ai eu que les tutoriaux webmatrix sur les bases de données pour avancer. 

    Quoi qu'il en soit encore merci,

    Cordialement. 

    lundi 27 février 2012 09:43
  • Désolé, j'ai fait une faute de frape.

    Mais en revenant sur votre code, je me suis rendu compte que votre requête attend deux paramètres là où vous en fournissez qu'un.

    Modifier plutôt votre code de la façons suivante :

    var updateQuery="UPDATE UserProfile SET pseudo='@0' WHERE UserId=@1";
    db.Execute(updateQuery, pseudo, idMember);

    J'ai supposé que la colonne [pseudo] est de type varchar, si c'est pas le cas ou s'il y a un souci enlevez les apostrophes. 

    Cordialement.


    lundi 27 février 2012 10:42
    Auteur de réponse
  • Premièrement, ça marche ! Donc merci beaucoup pour votre aide :)

    Ensuite si ça ne vous dérange pas j'aimerai juste comprendre quelques petites choses parce que même si le but est atteint comprendre c'est toujours un peu mieux ^^ après j'arrête de vous embêter :p

    Votre code envoyait dans pseudo littéralement @0 au lieu de ce que @0 contient ... faute de frappe ? j'ai enlevé les apostrophes et ça marche ...

    Mais la question c'est surtout concernant le db.Execute. Quand vous m'avez dit qu'il manquait un paramètre en entrée j'me suis dit "bon sang mais c'est bien sûr" et en fait en regardant de plus près le travail que j'avais déjà fait j'ai vu que ce n'était pas si "évident" tout compte fait puisque le code suivant :

    var updateQuery = "UPDATE questionMembre SET repondu=1 WHERE questionId=@0";
                            db.Execute(updateQuery, questionId);

    [...] marche parfaitement. Pourquoi ne pas passer en paramètre "repondu" ?

    Voilà c'est histoire d'affiner mes "connaissances" dans l'domaine !

    Encore merci d'm'avoir débloquer =) 

    Cordialement,

    Flo'

    lundi 27 février 2012 18:48
  • Bonjour,

    D'abord, vous nous embêter pas du tout, c'est toujours intéressant que de telle discussion se prolonge.

    Pour ce qui est de l'ajout d'apostrophes je l'ai rajouter car j'ai supposé que le champ [pseudo] était de type string, ce qui n'est pas le cas peut-être

    ou l'implémentation de la méthode Database.Execute s'en charge peut-être.

    Mais la clé de votre problème était l'oublie du paramètre pseudo.

    Quant à votre deuxième question, pour quoi ne pas passer en paramètre "repondu" :

    Ce n'est visiblement pas nécessaire car sa valeur était connue à l'avance (=1), il s'agit d'une constante connue au moment de l'écriture d code.

    Par contre dans votre requête qui a posé problème, on voie clairement qu'on voulait mettre à jour le pseudo d'un membre quelconque, le membre et la valeur du pseudo ne sont connu qu'à l’exécution et peuvent prendre un ensemble de valeurs fournies à l’exécution.

    Cordialement.

    lundi 27 février 2012 20:26
    Auteur de réponse
  • Super ! merci beaucoup pour les explications claires et les réponses rapides !!

    Cordialement =).

    Flo'.

    lundi 27 février 2012 20:34
  • A bientôt dans d'autres discussions qui seront super enrichissantes.

    Vous avez dit que vous débutez dans le domaine de l'informatique, mais moi je suis sûr que vous êtes fait pour l'informatique, en tous cas vos démarches le laisse penser. 

    Cordialement.

     
    lundi 27 février 2012 20:44
    Auteur de réponse