2
votes

System.Data.SqlClient.SqlException: nom de colonne non valide (erreur à la commande de ligne.ExecuteNonQuery ();)

Je reçois donc cette erreur tout le temps. Je ne sais pas si le problème vient du serveur SQL. Ce code pour insérer les données dans la base de données.

Envoyer de l'aide.

Je reçois ce message lors de l'exécution du code

private void registracija_btn_Click(object sender, EventArgs e)                        
{
        string RegistracijaUporabnisko = RegistracijaUporabnisko_txt.Text;
        string RegistracijaGeslo = RegistracijaGeslo_txt.Text;
        string RegistracijaMail = RegistracijaMail_txt.Text;

            try
            {
                string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
                     "VALUES(" + RegistracijaUporabnisko + ", " + RegistracijaGeslo + ", " + RegistracijaMail + ")";

                using (SqlCommand command = new SqlCommand(queryReg, con))
                {
                    con.Open();
                    command.ExecuteNonQuery();
                    con.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Napaka: " + ex);
            }

    }


8 commentaires

Le message d'erreur est assez clair na? Il indique que le nom de la colonne geslo est invalide / introuvable dans la table uporabnik2 vérifiez le nom de votre table / nom de la colonne


Et veuillez ajouter l'erreur sous forme de texte sans image.


Veuillez inclure la liste des champs du tableau car l'erreur elle-même semble assez claire et définitive. "Rok" est-il l'une des valeurs de vos variables?


@abestrad: quel est le problème avec cette image d'erreur?


Vous devriez également consulter Requêtes paramétrées pour éviter les vulnérabilités d'injection SQL


@sujithkarivelil personne n'aime les images contenant beaucoup de texte, et tous les sites d'images ne sont pas disponibles pour nous tous.


Nous recueillons des questions et des réponses pour servir de ressources aux personnes qui rencontrent des problèmes lors de la programmation. Un problème lors de l'ajout d'images est qu'elles ne seront peut-être pas disponibles à l'avenir, mais, comme nous utilisons Input, cela ne se produira probablement pas.


Copie possible de Quels sont les bons moyens d'empêcher l'injection SQL?


3 Réponses :


-2
votes

essayez

string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
                     "VALUES('" + RegistracijaUporabnisko + "', '" + RegistracijaGeslo + "', '" + RegistracijaMail + "')";

En règle générale, vous devez uniquement inclure la valeur des données de type chaîne, mais pour un côté plus sûr, mettez toujours la valeur entre guillemets simples dans l'instruction d'insertion


1 commentaires

"Cependant, pour un côté plus sûr, insérez toujours la valeur dans le guillemet simple dans l'instruction d'insertion" - oh mon Dieu non; c'est ainsi que vous êtes piraté. La réponse est toujours paramètres. Il n'y a pas d'exceptions intéressantes (dans le code de routine, de toute façon).



3
votes

Les paramètres (ci-dessous) corrigent ce problème et une série d'autres problèmes, y compris l'injection SQL, i18n / l10n, etc. Il est également possible que vous ayez simplement tapé un nom de colonne, dans Dans quel cas nous ne pouvons pas vous aider car nous ne connaissons pas le vrai nom.

con.Execute("INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
     "VALUES(@uporabnisko_ime, @geslo, @email)", new {
    uporabnisko_ime = RegistracijaUporabnisko_txt.Text,
    geslo = RegistracijaGeslo_txt.Text,
    email = RegistracijaMail_txt.Text });

Je ne me lasse pas non plus de recommander des outils comme Dapper pour des choses comme celle-ci:

XXX

qui fait tout, y compris (si nécessaire) l'ouverture / fermeture de la connexion, la construction de commandes, le conditionnement des paramètres, etc.


1 commentaires

Merci beaucoup! Cela a fonctionné pour moi et j'ai beaucoup appris!



3
votes

Regardons votre code:

  string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) VALUES(@RegistracijaUporabnisko ,@RegistracijaGeslo ,@email)";

    using (SqlCommand command = new SqlCommand(queryReg, con))
    {
        command.Parameters.AddWithValue("@RegistracijaUporabnisko ", RegistracijaUporabnisko );
        command.Parameters.AddWithValue("@RegistracijaGeslo ", RegistracijaGeslo );
        command.Parameters.AddWithValue("@email", email);
        con.Open();
        command.ExecuteNonQuery();
        con.Close();
    }

Ok donc si RegistracijaUporabnisko a la valeur Rok, RegistracijaGeslo la valeur Rok et RegistracijaMail la valeur Rok @ home .. à quoi ressemble maintenant votre chaîne? eh bien

 string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) VALUES(Rok,Rok,Rok@home)";

le Rok qu'il rechercherait alors est un champ, pas une valeur. Par conséquent, il est dit colonne invalide.

Et si vous faisiez une méthode couramment adoptée de

      string queryReg = "INSERT INTO uporabnik2(uporabnisko_ime, geslo, email) " +
             "VALUES(" + RegistracijaUporabnisko + ", " + RegistracijaGeslo + ", " + RegistracijaMail + ")";

        using (SqlCommand command = new SqlCommand(queryReg, con))
        {
            con.Open();
            command.ExecuteNonQuery();
            con.Close();
        }

Que se passe-t-il maintenant? Eh bien, dans les coulisses du texte est entré avec des guillemets autour de lui, les dates sont envoyées dans un format approprié, les nombres tout cela .. géré pour vous. Il vous protège de l'injection de sorte que si j'entre un nom de "; drop table uporabnik2 vous ne vous retrouverez pas à perdre la table etc.


2 commentaires

Merci beaucoup! Cela a fonctionné pour moi et j'ai beaucoup appris!


@ RokŠekoranja Participez à une visite pour savoir comment accepter des réponses en cliquant sur la coche à côté de la réponse, lorsqu'un message répond à votre question.