-1
votes

Problème avec la vérification de la valeur choisies de la liste déroulante existe dans la base de données ou non

J'ai une page Web et j'ai des champs pour conserver des fichiers de données là-bas.

Un de champ conserve les identifiants et les noms de l'étudiant qui a enregistré un cours spécifié. Je veux pouvoir enregistrer de nouveaux étudiants au cours en utilisant DropdownList. Si l'élément sélectionné dans DropdownList existe déjà dans la table de cours, je devrais afficher un message d'erreur. J'ai un code pour les faire, mais lorsque j'ai sélectionné une valeur dans la liste déroulante qui existe déjà, il n'exprime pas un message d'erreur. Il suppose que c'est une nouvelle valeur et qu'il jette une exception, car la base de données n'accepte pas les enregistrements en double.

Comment puis-je résoudre cette affaire?

J'utilise c # Langue pour concevoir cette page Web dans asp.net. xxx

Lorsque je sélectionne un nom de Dropdownlist qui n'existe pas dans la base de données, Je reçois un résultat approprié.

Par exemple, réfléchissez à "Jeff Bezos" est déjà enregistré pour le cours donné. Lorsque je choisis "Jeff Bezos", je devrais obtenir un message d'erreur mais j'obtiens une exception qui dit que c'est dupliquer.


17 commentaires

Quelle est la valeur d'exécution de la requête que vous exécutez? Y a-t-il des lignes correspondantes? Le comportement décrit suggère qu'il n'y en a pas.


Pour la variable QS (valeur extraite de la chaîne de requête) 5 et la valeur choisies de la valeur choisie Jeff Bezos Il existe 1 enregistrement qui signifie enregistrer.


Quel lecteur retourné?


Je vous suggère fortement de modifier votre code pour utiliser des paramètres dans la SQL NON Créer une instruction SQL directement à partir des valeurs d'interface utilisateur - évitez les attaques d'injection SQL.


@Ahmeett_: Si un enregistrement correspondant existe, alors lecteur.hasrows est vrai . Quel est exactement le problème ici? Lorsque vous traversez cette ligne par ligne dans votre débogueur, ce qui se produit spécifiquement et où cela échoue spécifiquement?


Quelle est la valeur de Dropdownlist pour Jeff Bezos et ID d'étudiant pour Jeff Bezos dans la base de données?


J'envisentirais également un identifiant ici pour référence sur un à l'aide de SQLConnection (... pour ce Stackoverflow.com/ Q / 23185990/125981


@David attendait Reader.HASROWS est vrai, mais il retourne faux


@Ahmeett_: Vous fournissez des informations conflictuelles. Il semble que vos hypothèses ne correspondent pas à vos résultats observés. Alors ... déposer les hypothèses. Si lecteur.hasRows est false puis le lecteur a pas de lignes . Il y a aucun enregistrement correspondant . Donc, votre requête n'est pas ce que vous attendez. Alors utilisez votre débogueur et observe ce que votre requête est . Qu'est-ce que c'est? Quelles données exactes sont dans vos tables? Pourquoi vous attendez-vous quelque chose de différent? Élaborer.


@Thamarai T: Jeff Bezos Un élément de DropdownList comme étudiantName et son identifiant est 1.


@DAVID: SQLCOMMAND CMD = Nouveau SQLCOMMAND ("SELECT * de l'inscription en tant que E, Étudiants selon l'endroit où E.Studentid = S.Studentided et" + "traitid =" + qs + "et étudiantname =" "+ SV +" " , con);


Je veux dire, quelle est la sortie que vous obtenez de string sv = dropdownlist1.selectedItem.value;


@David quand j'ai changé cela comme ça -> SQLCOMMAND CMD = Nouveau SQLCOMMAND ("SELECT * de l'inscription en tant que E, Étudiants selon l'endroit où E.Studentided = S.Studentided et" + "traite =" + qs + "et étudiantname =" Jeff Bezos ', Con); puis lecteur.hasrows est vrai


@Thamarait: la sortie est Jeff Bezos


@Ahmeett_: Ce n'est pas un code SQL. C'est C # code qui produit de manière dynamique code SQL. Clairement, il ne produit pas le code SQL que vous attendez de la production. Donc, le résultat que vous suppose la production est incorrect. Donc arrêtez de supposer . Quel est le code SQL exécuté . Si vous déboguez votre code, nous pouvons vous aider. Si tout ce que vous voulez faire, c'est insister sur le fait que votre code devrait avoir raison et cherche quelqu'un à être d'accord avec vous, ce n'est pas le bon endroit pour cela.


Essayez ceci sqlcommand cmd = nouveau SQLCOMMAND ("SELECT * à partir de l'inscription en tant que E, des étudiants comme s, où e.studentid = s.studentided et" + "traitid =" + qs + "et ** s.studentname ** = 'Jeff Bezos', Con);


chaîne qs = demande.Quiserystring ["ID"]; Prombel est là que je l'ai réparé. ID est une valeur entière mais j'ai choisi la chaîne.


3 Réponses :


0
votes
protected void DropDownList1_SelectedIndexChanged(object sender, 
    EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Ceng.mdf;Integrated Security=True");

        int selectedCourseId = 0;
        string qs = Request.QueryString["id"];        

        int.TryParse(qs, out selectedCourseId);

        string sv = DropDownList1.SelectedItem.Value;           

        SqlCommand cmd = new SqlCommand("Select * from Enrolment as e, Students as s where e.StudentID = s.StudentID and " +
                          "e.CourseID = @CourseID and s.StudentName = @StudentName", con);

        cmd.Parameters.Add("@CourseID", SqlDbType.Int).Value = selectedCourseId;
        cmd.Parameters.Add("@StudentName", SqlDbType.NVarChar).Value = sv;

        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();

        if(reader.HasRows)
        {
            Label1.Visible = true;
            Label1.Text = "The selected student is already registered to the course!";
            Label1.ForeColor = Color.Red;
        }
        else
        {
            Label1.Visible = true;
            Label1.Text = "The selected student is succesfully registered!";
            Label1.ForeColor = Color.Green;


            SqlDataSource4.Insert();
            GridView1.DataBind();
        }

        reader.Close();
        con.Close();
    }

1 commentaires

Y a-t-il une raison pour laquelle vous choisissez de 2 tables et construisez toute la croix au lieu de les rejoindre? Aussi en utilisant * comme sélecteur est une mauvaise pratique. Vous ne devez sélectionner que les lignes dont vous avez besoin pour des raisons de vitesse ..



0
votes

ID est une valeur entière dans ma base de données, donc j'ai changé de type de QS comme contre int qs = int.parse (demande.Quiserystring ["id"]);

Après une partie de la partie du code devrait être comme String SV = Dropdownlist1.SelectedItem.text;

Après avoir changé ces codes, j'ai des résultats réels


0 commentaires

1
votes
  1. Paramètre du SQL
  2. Faites le SQL une chaîne / texte et utilisez-le
  3. Débarrassez-vous si Bad Associative Inscrissez, créez un intérieur au lieu de
  4. Utilisez un en utilisant qui implémente Idisposable
  5. hypothèses depuis que vous n'avez pas posé la source de la liste
  6. une hypothèse large sur la chaîne INT VS pour l'ID (INT est la plus courante, donc je vais avec cela)
  7. suggère que cela pourrait être refacturé aux méthodes de meilleur test xxx

0 commentaires