System.Data.SqlClient.SqlException: неверное имя столбца (ошибка в строке command.ExecuteNonQuery ();)

2

Так что я получаю эту ошибку все время. Я не уверен, что проблема в SQL-сервере или просто в моих навыках кодирования. Этот код для вставки данных в базу данных.

Отправить помощь.

Я получаю это сообщение во время выполнения кода

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);
            }

    }
  • 3
    Сообщение об ошибке достаточно понятно? В нем говорится, что имя столбца geslo недопустимо / не найдено в таблице uporabnik2 Проверьте вашу таблицу / имя столбца.
  • 1
    И, пожалуйста, добавьте ошибку как текст без изображения.
Показать ещё 6 комментариев
Теги:
connection

3 ответа

2

Давайте посмотрим на ваш код:

      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();
        }

Итак, если RegistracijaUporabnisko имеет значение Rok, RegistracijaGeslo - значение Rok, а RegistracijaMail - значение Rok @home. Как теперь выглядит ваша строка? Что ж

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

Рок, который он будет искать, это поле, а не значение. Отсюда и неверный столбец.

Так что, если вы сделали это общепринятым способом

  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();
    }

Что происходит сейчас? Ну, за кулисами текст вводится с кавычками вокруг него, даты отправляются в соответствующем формате, нумерация всего этого... обрабатывается для вас. Он защищает вас от инъекций, поэтому, если я "; drop table uporabnik2 имя "; drop table uporabnik2 вы не потеряете таблицу и т.д.

  • 1
    Большое спасибо! Это сработало для меня, и я многому научился!
  • 0
    @ RokŠekoranja Совершите экскурсию, чтобы узнать, как вы можете принимать ответы, нажав на флажок рядом с ответом, когда сообщение отвечает на ваш вопрос.
2

Параметры (ниже) исправляют это и ряд других проблем, включая внедрение SQL, i18n/l10n и т.д. Также возможно, что вы просто опечатали имя столбца, и в этом случае мы не можем помочь вам с этим как мы не знаем настоящее имя.

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

using (SqlCommand command = new SqlCommand(queryReg, con))
{
    con.Open();
    command.Parameters.AddWithValue("@uporabnisko_ime", RegistracijaUporabnisko_txt.Text);
    command.Parameters.AddWithValue("@geslo", RegistracijaGeslo_txt.Text);
    command.Parameters.AddWithValue("@email", RegistracijaMail_txt.Text);
    con.Close();
}

Я также никогда не устану рекомендовать такие инструменты, как Dapper, для таких вещей:

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 });

который делает все, включая (при необходимости) открытие/закрытие соединения, построение команды, упаковку параметров и т.д.

  • 1
    Большое спасибо! Это сработало для меня, и я многому научился!
-3

пытаться

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

Как правило, вам нужно только заключить значение данных строкового типа, однако для большей безопасности всегда заключайте значение в одиночную кавычку в операторе вставки

  • 2
    «однако для большей безопасности всегда заключайте значение в одинарную кавычку в операторе вставки» - о боже, нет; вот как тебя взломали. Ответ всегда параметры. Там нет интересных исключений (в обычном коде, в любом случае).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню